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

时间:2011-11-22 05:29:08

标签: c# async-ctp

我有一个需要很长时间才能运行的方法:它调用数据库并同步进行某些计算:

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

我想为它编写一个包装器,以便能够使用'await'关键字从我的WinForms UI中使用它。为此,我创建了另一个方法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));
}

那么,哪个选项更可取,为什么?正如您所看到的,区别在于存在/不存在“异步”和“等待”关键字。

谢谢!

2 个答案:

答案 0 :(得分:7)

使用第二个选项。

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

Stephen Toub有一个来自BUILD的精彩视频,名为The Zen of Async: Best Practices for Best Performance,涵盖了async / await开销和替代方案。

答案 1 :(得分:4)

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

至于可读性:我应该只使用异步才能真正发挥作用。 async for me意味着某个方法以异步方式在多个步骤中完成。当您定义如上所述的简单代理方法时,您不希望进一步使语法复杂化。