如果可能的话,我应该省略async / await吗?

本文关键字:async await 我应该省 如果 | 更新日期: 2023-09-27 18:15:27

我有一个方法需要很长时间运行:它调用DB并同步进行某些计算:

public static MyResult MyMethod(int param1, int param2)
{
    // run a DB query, wait for result, make calculations...
    ...
}

我想为它写一个包装器,能够使用它从我的WinForms UI与'await'关键字。为此,我创建了另一个方法MyResultAsync。我有一个选择,如何准确地写它:

// option 1
public async static Task<MyResult> MyResultAsync(int param1, int param2)
{
    return await TaskEx.Run(() => MyMethod(param1, param2));
}
// option 2
public static Task<MyResult> MyResultAsync(int param1, int param2)
{
    return TaskEx.Run(() => MyMethod(param1, param2));
}

那么,哪个选项是更好的,为什么?正如你所看到的,区别仅仅在于是否存在'async'和'await'关键字。

谢谢!

如果可能的话,我应该省略async / await吗?

使用第二个选项

您的第一个选项创建一个Task<MyResult>,然后创建另一个Task<MyResult>来包装它。包装不会增加任何价值,只是增加了开销。

Stephen Toub有一个来自BUILD的很棒的视频,叫做The Zen of Async:最佳性能的最佳实践,其中涵盖了async/await开销和替代方案。

这都是关于async是如何工作的。如果您阅读http://msdn.microsoft.com/en-us/magazine/hh456402.aspx,特别是:http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229662.aspx,您会发现async关键字使编译器在您的代码中构建一个状态机。这是开销,并且出于性能考虑,将会执行得更差,因为在给定的代码中绝对不需要。

至于可读性:我应该只在真正能产生影响的地方使用async。异步对我来说意味着某个方法以异步方式在多个步骤中完成。当您像上面那样定义一个简单的代理方法时,您不希望使语法进一步复杂化。