等待非异步方法

39

我对C#中的等待/异步模式感到非常困惑。

我有一个窗体应用程序,我想调用一个需要20秒钟完成大量处理的方法。因此,我想要使用await来等待它完成。我以为正确的方法是将其标记为async Task,但这样做会产生警告,因为我在其中没有使用await

通过谷歌搜索,我发现可以返回TaskCompletionSource<T>,但我没有返回类型,因为它是void。

如何使用await调用此方法?


8
async不会在后台线程上执行方法;我有一篇介绍async/await的文章,你可能会发现有帮助。 - Stephen Cleary
1个回答

83

按照以下方式调用您的方法:

await Task.Run(() => YourMethod());

使用Task.Run方法时,它会为您创建一个可等待的任务。


1
Task.Run在主UI线程上运行“YourMethod”,还是创建一个新的线程?(例如WinForms) - Harag
4
“@harag 一番研究后,可以发现(实际上是从MSDN中得知),Task.Run会将指定的工作排队运行在线程池上,并返回表示该工作的任务对象。因此答案很可能是(我认为对于WinForms肯定如此)。" - Erik Philips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接