我正在努力理解async/await,认为自己已经了解了一些用法。但是仍然不太清楚在下面这种情况下实际的好处是什么。
看一下Task.Run的用法。第一个方法使用普通委托并使用Thread.Sleep,但第二个方法使用'async'委托和Task.Delay。
我的问题是:这与该方法有何区别(或者说没有区别)?
该方法本身是异步方法。此代码通过Task.Run创建了一个单独的线程,并且该线程除了执行该委托外没有其他事情可做。因此,即使它在Task.Delay上使用了await,但在这种情况下有什么用处,因为该线程无论如何都是个孤立的线程,即使仅使用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 normal delegate
public async Task<bool> RetrySendEmail(MailMessage message)
{
bool emailSent = false;
await (Task.Run(***()*** =>
{
for (int i = 0; i < 3; i++)
{
if (emailSent)
break;
else
// Wait for 5 secs before trying again
***Thread.Sleep(5000);***
try
{
Smtphost.Send(message);
emailSent = true;
break;
}
catch (Exception e){ emailSent = false; // log; }
}
return emailSent;
}));
}
Task.Run(() => ...I/O...)
vsTask.Run(async() => ...I/O...)
。在这里,我在循环中执行了25个爬取请求,但是我没有感觉到任何性能(时间)上的差异。 - LegendsTask.run
是因为 ScrapingLib 还不支持async/await
。 - Legends