[HttpPost]
public async Task<ActionResult> SendTask(TaskModel taskModel)
{
MailTask task = taskModel.BuildTask();
await Task.Run(() =>
{
task.Send(); // <- it is not async method
// bla bla bla... my other no async code
});
return _jsonDataResult;
}
有意义吗?我只是在运行动作,在我的任何代码中。 我一直看到在'await'之后到处调用“ToListAsync()或SaveChangesAsync()”的示例 - 它是.NET异步操作。但如果我不使用它,而是我只使用等待Task.Run(()=&gt; {x = 5 + 5;}))它将是异步的吗?
答案 0 :(得分:3)
如果我不使用它,而是我只使用等待Task.Run(()=&gt; {x = 5 + 5;}))它将是异步的吗?
这就是我所谓的“假异步”。也就是说,它行为就像是异步的(返回await
编辑的任务,等等),但实际上它正在另一个线程上进行同步工作
有意义吗?
没有。 await Task.Run
在ASP.NET上唯一能做的就是导致线程上下文切换完全没有任何好处。因此,您无缘无故地减慢响应时间。
有关详细信息,请参阅article on async ASP.NET的“异步代码不是银弹”部分。
答案 1 :(得分:1)
通常这没有意义,并且只要您没有涉及I / O操作,就不会在操作级别上真正异步。 I / O操作(例如数据库交互,即SaveChangesAsync
或ToListAsync
)需要比CPU上的计算完成更长的时间,因此CPU花费相对大量的时间等待I / O完成。虽然在计算5 + 5时没有等待。
同步完成时等待阻止整个线程。另一方面,异步操作不会阻止它,但切换到执行其他工作并让操作系统在请求完成时通知它。然后再从那里拿起。这也是运行时成本(上下文切换),因此如果没有实际的I / O,它通常不会有太多帮助。
一些现实生活中的类比:
我喜欢Jon Skeet关于异步操作的披萨比喻(the speech is well worth watching):异步操作是在准备和发送电影时订购比萨饼和看电视。同步操作正在门口等待,直到比萨饼到达。 (或者:你应该,而不是订购披萨,只计算5 + 5,在那次操作过程中看电视是没有意义的。)
答案 2 :(得分:-1)
通常,当我们在REST API中使用await时,我们将使用异步返回类型
像这样: - static async void ProcessDataAsync()
{
// Start the HandleFile method.
Task<int> task = HandleFileAsync("C:\\enable1.txt");
// Control returns here before HandleFileAsync returns.
// ... Prompt the user.
Console.WriteLine("Please wait patiently " +
"while I do something important.");
// Wait for the HandleFile task to complete.
// ... Display its results.
int x = await task;
Console.WriteLine("Count: " + x);
}