2011-11-22 77 views
4

我有需要长时间运行的方法:它调用数据库,并让某些计算同步:如果可能,我应该省略异步/等待吗?

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

我想编写一个包装它,能够从我的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)); 
} 

那么,哪个选项是可取的,为什么?正如你所看到的,不同之处在于存在/不存在“异步”和“等待”关键字。

谢谢!

回答

4

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

至于可读性:我应该只使用异步它真的可以有所作为。对我而言,异步意味着某种方法以异步方式在多个步骤中完成。当你定义一个像上面这样简单的代理方法时,你不希望进一步复杂的语法。

6

使用第二个选项。

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

Stephen Toub有一段来自BUILD的视频The Zen of Async: Best Practices for Best Performance,其中涵盖了async/await开销和替代品。