我在网上搜索过,看过很多关于task.run和等待异步的问题,但是有一个特定的使用场景,我并不是真的了解它的区别.我相信情景非常简单.
await Task.Run(() => LongProcess());
Run Code Online (Sandbox Code Playgroud)
VS
await LongProcess());
Run Code Online (Sandbox Code Playgroud)
其中LongProcess是一个异步方法,其中包含一些异步调用,例如调用db并等待ExecuteReaderAsync().
题:
这种情况下两者之间有什么区别吗?感谢任何帮助或意见,谢谢!
我已经在这篇MSDN文章中使用ASP.NET MVC 4中的使用异步方法设置了示例,并做了一些基准测试以了解我的想法.
我设置了2个控制器Sync,Async并使用加载器工具进行了基准测试.加载器工具只发送50-60个常量请求一分钟.每个控制器调用相同的Web服务3次.每个代码如下:
public ActionResult Sync()
{
var g1 = GetGizmos("url1");
var g2 = GetGizmos("url2");
var g3 = GetGizmos("url3");
return Content("");
}
public object GetGizmos(string uri)
{
using (WebClient webClient = new WebClient())
{
return JsonConvert.DeserializeObject(
webClient.DownloadString(uri)
);
}
}
Run Code Online (Sandbox Code Playgroud)

public async Task<ActionResult> Async()
{
var g1 = GetGizmosAsync("url1");
var g2 = GetGizmosAsync("url2");
var g3 = GetGizmosAsync("url3");
var a1 = await …Run Code Online (Sandbox Code Playgroud) 我有一个要异步运行的I / O绑定方法。
在帮助文档中,它提到我应该使用async并在没有Task.Run的情况下等待
报价
对于绑定到I / O的代码,您需要等待一个操作,该操作将在异步方法内部返回Task或Task。
如何从winforms按钮单击事件中执行此操作?
我试过了
private void button_Click(object sender, EventArgs e)
{
await doLoadJob();
}
private async Task<int> doLoadJob()
{
await loadJob();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在努力巩固我对异步和等待的理解.我终于理解了关于上下文切换的全部内容(这都是魔术).我写了一个简短的winform程序来玩它.请考虑以下事项
private async void button1_Click(object sender, EventArgs e)
{
output.Text = "start";
var intRet = await Task.Run(() => RunALot());
output.Text += " after run ";
output.Text += intRet.ToString();
}
private async Task<int> RunALot ()
{
int temp = 0;
for (int ini = 0; ini <= 40000; ini++)
{
temp += ini;
}
return temp;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经有一个Task.Run我正在调用的时候我RunALot.是否需要将其内部包装RunALot到另一个内部Task.Run并await使其真正异步?嵌套上下文有任何性能影响 - 我可以在多大程度上嵌套上下文?
假设我有一个方法如下......
public static async Task DoIt(Func<Task> doit) {
// Do something first
await doit();
// Do something last
}
Run Code Online (Sandbox Code Playgroud)
我可以传递一个可等待的函数,如下所示......
await DoIt(() => Task.Delay(1000));
Run Code Online (Sandbox Code Playgroud)
如果我想传递一些不可等待的东西,我可以这样做......
_ = DoIt(() => Task.Run(() => Console.WriteLine("Hi")));
Run Code Online (Sandbox Code Playgroud)
......但这看起来很丑陋。有没有更简洁的方法来做到这一点?