5

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

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”关键字的存在/不存在。

谢谢!

4

2 回答 2

8

使用第二个选项。

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

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

于 2011-11-22T16:43:53.063 回答
4

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

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

于 2011-11-22T05:59:48.680 回答