我刚刚遇到了一些代码:
var task = Task.Run(async () => { await Foo.StartAsync(); });
task.Wait();
Run Code Online (Sandbox Code Playgroud)
(不,我不知道其内部运作方式Foo.StartAsync()).我最初的反应是摆脱async/ await并重写为:
var task = Foo.StartAsync();
task.Wait();
Run Code Online (Sandbox Code Playgroud)
这是否正确(再一次,一无所知Foo.StartAsync()). 这个答案与它有什么不同 - 用Task.Run运行'异步'动作委托......似乎表明可能存在可能有意义的情况,但它也说"说实话,我没有"看到很多场景......"
我试图让我的头围绕异步/等待,并认为我确实理解了一些关于使用的事情.但仍然不太清楚在下面的场景中实际的好处是什么.
查看Task.Run用法.第一种方法使用普通委托并使用Thread.Sleep,但第二种方法使用'async'委托和Task.Delay.
我的问题是:这对这种方法有什么影响(或者它没有)?
该方法本身是一种异步方法.代码正在创建一个单独的线程(通过Task.Run),除了执行该委托之外,该线程没有其他任何操作.因此,即使它在Task.Delay上产生等待,在这种情况下有什么用处,因为线程无论如何都是一个孤立的线程没有用于任何其他东西,即使它只是使用Thread.Sleep,线程仍然是上下文切换到处理器的其他线程.
// The task thread uses a async delegate
public async Task<bool> RetrySendEmail(MailMessage message)
{
bool emailSent = false;
await (Task.Run(***async ()*** =>
{
for (int i = 0; i < 3; i++)
{
if (emailSent)
break;
else
// Wait for 5 secs before trying again
***await Task.Delay(5000);***
try
{
Smtphost.Send(message);
emailSent = true;
break;
}
catch (Exception e) { emailSent = false; // log; }
}
return emailSent;
}));
}
// The task thread uses a …Run Code Online (Sandbox Code Playgroud)