【发布时间】:2018-08-17 17:41:48
【问题描述】:
我最近遇到了由我们为我们工作的承包商编写的这段代码。它要么非常聪明,要么很愚蠢(我认为是后者,但我想要第二个意见)。我对 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();? -
如果“其他东西”足够重,
Task.Run不是低效的 -async不会使任何东西异步运行。await之前的所有内容都将在调用线程上运行。如果你需要它同时运行,你应该使用Task.Run,或者更好的是,将它提取到它自己的方法中,该方法将被Task.Run调用 -
@PanagiotisKanavos,嗯,是的,这确实让我想到了。我不认为他真的明白自己在做什么。
-
你真的需要同步版本吗?
标签: c# multithreading asynchronous async-await task-parallel-library