【发布时间】:2019-08-08 01:03:14
【问题描述】:
我最近在 WinForm 应用程序中遇到了这段代码,我不知道是否有任何理由在等待的 Task.Run 中运行 async 代码。
public async Task SaveStuff()
{
await Task.Run(() => SaveStuffAsync().ConfigureAwait(false));
await Task.Run(() => SendToExternalApiAsync().ConfigureAwait(false));
}
private async Task SaveStuffAsync()
{
await DbContext.SaveChangesAsync().ConfigureAwait(false);
}
private async Task SendToExternalApiAsync()
{
// some async code that is awaited with ConfigureAwait(false);
}
如果没有 Task.Run,这段代码不会做同样的事情吗?
public async Task SaveStuff()
{
await SaveStuffAsync().ConfigureAwait(false);
await SendToExternalApiAsync().ConfigureAwait(false);
}
【问题讨论】:
-
尽管
SaveStuffAsync这样的方法被声明为异步方法,但它总是有可能阻塞调用线程。在线程池线程上调用它可确保您的 UI 不会冻结,无论(可能)异步方法的实际实现如何。 -
@peter-duniho 那么到底哪个问题与这个问题重复?
-
他们都讨论了通过
Task.Run()调用非异步方法、通过Task.Run()调用异步方法和直接等待异步方法之间的区别。所以......所有这些。 -
@peter-duniho 我的问题根本不涉及非异步方法。
标签: c# async-await