如何使异步方法返回一个值?

Ove*_*119 69 c# asynchronous

我知道如何制作Async方法但是我说有一个方法可以做很多工作然后返回一个布尔值?

如何在回调中返回布尔值?

澄清:

public bool Foo(){
    Thread.Sleep(100000); // Do work
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够使这个异步.

Dav*_*ell 118

C#5.0,您可以将方法指定为

public async Task<bool> doAsyncOperation()
{
    // do work
    return true;
}

bool result = await doAsyncOperation();
Run Code Online (Sandbox Code Playgroud)

  • 对于任何关心的人来说,要获得结果你要使用`bool result = await doAsyncOperation();` (24认同)
  • @KingOfHypocrites`retit await Task.FromResult(true)`将解除该警告. (4认同)
  • 每当您打算使用"await"关键字时,它都必须位于已标记为"异步"的方法中.我原来只是工人方法必须这样标记.例如,即使您的调用方法不返回任何内容,您也必须将其命名为"async void MyCallerMethod" (3认同)
  • 这实际上不会异步执行任何操作,除非您在方法主体中“等待”某些内容。返回`Task.FromResult(true)` 不会改变这一点。方法主体在调用者的线程上同步运行,直到第一次等待。 (2认同)
  • 看起来我喜欢这个工作"bool result = ..."行也必须在异步方法中,所以我不认为这真的回答了这个问题 (2认同)

Mar*_*ell 55

有几种方法可以做到这一点......最简单的方法是让异步方法也进行后续操作.另一种流行的方法是传入回调,即

void RunFooAsync(..., Action<bool> callback) {
     // do some stuff
     bool result = ...

     if(callback != null) callback(result);
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是在异步操作完成时引发事件(结果在event-args数据中).

此外,如果您使用的是TPL,则可以使用ContinueWith:

Task<bool> outerTask = ...;
outerTask.ContinueWith(task =>
{
    bool result = task.Result;
    // do something with that
});
Run Code Online (Sandbox Code Playgroud)

  • 很好的回调方法的简单例子 (4认同)