2012-09-03 37 views
14

如果我有我想要一个正常的方法异步:为什么要使用异步并等待Task <>?

public int Foo(){} 

我会做:

public Task<int> FooAsync(){ 
    return Task.Run(() => Foo()); 
} 

我为什么会做:

public async Task<int> FooAsync(){ 
    return await Task.Run(() => Foo()); 
} 

我计划的方式使用这个是:

FooAsync().ContinueWith((res) => {}); 

我希望方法不停止运行,但我希望像回调被触发,因此ContinueWith。但是在第二个版本中,使用它有什么意义?

回答

14

在我的理解,你只需要asyncawait当你写,做一些异步调用里面的方法,但好像什么都你将它想样子。换句话说,您希望编写和读取代码,就像它是一些正常的顺序代码一样,处理异常就好像它是正常的顺序代码一样,返回值就好像它是正常的顺序代码一样等等。然后编译器的责任是用保留逻辑的所有必要回调来重写该代码。

你的方法非常简单,我认为它不需要重写,你可以返回任务,但谁消耗它可能想要await它的返回值。

+0

优秀的描述! – paulsm4

+0

谢谢@ paulsm4。我必须说,我只是重复我最近听到的,我认为,它来自http://hanselminutes.com/327/everything-net-programmers-know-about-asynchronous-programming-is-wrong,但不是100%确定。我还没有太多的异步功能的经验,所以我可能是错的,我很乐意学习更多,也许异步在这种情况下提供了一些好处。 –

+2

此外,您可能想阅读[我应该公开同步方法的异步封装?](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx)(答案几乎总是“不”;如果你有一个同步方法,那么给它一个同步方法签名)。 –

5

我为什么会做:

public async Task<int> FooAsync() 
{ 
    return await Task.Run(() => Foo()); 
} 

你不会的。你以前的版本返回已经可以等待的任务。这个新版本不会添加任何内容。

我打算使用的方法就是:

FooAsync().ContinueWith((res) => {}); 

我想要的方法,只是不停止运行,但我想是这样的回调将被解雇,因此ContinueWith。

这就是差别来自于我们充实您的例子一点点:

void DoAsyncStuff() 
{ 
    FooAsync().ContinueWith((res) => { DoSomethingWithInt(res.Result) }); 
} 

使用async,你可以写相同的代码是这样的:

void async DoAsyncStuff() 
{ 
    int res = await FooAsync(); 
    DoSomethingWithInt(res); 
} 

的结果是一样的。关键字await将您的方法的其余部分变为继续,在FooAsync产生一个值后恢复。这就像你的其他代码,但更容易阅读。 *耸肩*

+0

你的'async'方法真的不应该'无效返回。 'async'方法只有在它们将成为事件处理程序时才会返回。如果方法中没有返回值,它应该返回'Task'。除此之外,体面足够的职位。 – Servy

+0

@Servy“异步方法只有在它们将成为事件的处理程序时才会返回。”这就是这种情况,对吧?在这个例子中'DoAsyncStuff'应该返回什么,以及它会在不写多余的代码的情况下获得该值的位置?另外,如果一个异步方法返回Task并且你不*等待它,你会得到一个编译器警告(CS4014),这很烦人。我最近[问了那个问题]在这里(http://stackoverflow.com/questions/14903887/warning-this-call-is-not-awaited-execution-of-the-current-method-continues)。如果你有更好的答案,你可以在那里发布吗? – Mud

+0

当一个'async'方法返回void时,它基本上使它成为一个“火再遗忘”的方法。调用者无法知道方法何时实际完成。 OP的代码中没有任何迹象表明这就是他想要的。至于编译器的警告,那是因为你几乎可以肯定*不想那么做*,正如我在你链接的文章中告诉你的那样;警告*正确*,表明您的设计存在缺陷,而且您不希望自己的行为出现问题。虽然你可能会在一些边缘情况下需要这种行为,但我支持我的断言。 – Servy