最近我看到了一个自由承包商写的代码,在我们公司为我们工作。它可能非常巧妙,也可能很傻(我认为是后者,但我想要第二个意见)。我对async
和await
的使用不是非常精通。
基本上它的运作方式如下:
public bool Send(TemplatedMessageDto message)
{
return Task.Run(() => SendAsync(message))
.GetAwaiter()
.GetResult();
}
public async Task<bool> SendAsync(TemplatedMessageDto message)
{
//code doing stuff
var results = await _externalresource.DothingsExternally();
//code doing stuff
}
现在我理解第一个 Task.Run()
是没有意义和低效的?实际上应该是:
public bool Send(TemplatedMessageDto message)
{
return SendAsync(message))
.GetAwaiter()
.GetResult();
}
public async Task<bool> SendAsync(TemplatedMessageDto message)
{
//code doing stuff
var results = await _externalresource.DothingsExternally();
//code doing stuff
}
我还不确定这是否真的是异步方法,因为它仍然会等待,对吧?我认为即使重新编写,它唯一的优点就是释放主工作线程。
有人可以确认这个第一个任务不应该在那里吗?
GetAwaiter().GetResult()
调用而不是.Result
?为什么要等待,而不是编写public async Task<bool> Send ... await Task.Run();
? - Panagiotis KanavosTask.Run
并不低效 -async
并不能使任何东西异步运行。在await
之前的所有内容都将在调用线程上运行。如果需要并发运行它,应使用Task.Run
,或者更好的方法是将其提取到自己的方法中,并使用Task.Run
进行调用。 - Panagiotis Kanavos