如何等待async void完成?

时间:2015-12-18 18:13:55

标签: c# asynchronous async-await task

我需要等待async void完成。它中有一些await Task.Delay函数,我需要它们才能继续。这个空白并没有返回任何东西,所以我没有看到它成为async Task<>的理由,而且我也在这个空洞内洗了一个数组,我宣布了一些变量。那我该怎么做呢? async Task<>是唯一的方法吗?我的空虚并不期待任何参数/输入。

3 个答案:

答案 0 :(得分:6)

返回Task(不是Task<T>)而不是void。注意,Task的非泛型形式不需要包装值。它只是用于信令完成或错误,而不是结果。对于async方法,这相当于同步void返回类型。这意味着您可以等待您的方法完成。

答案 1 :(得分:0)

每个异步函数都应该返回Task而不是void和Task <TResult&gt;而不是TResult。唯一的例外是事件处理程序。

因此,如果您的异步函数不是事件处理程序,它应该返回Task。一旦完成,你可以等待它......

...嗯,只要您的函数也被声明为异步并返回任务或任务<TResult&gt;,这使得您的客户端都必须是异步的。

如果您有同步功能并想要调用异步功能,请使用以下命令:

var myTask = Task.Run( () => SomeAsyncFunction(...));
// while my task is running you can do other things
// after a while you need the result:
Task.Wait();

// only if SomeAsyncFunction returns Task<TResult>:
TResult result = Task.Result();

请注意,这将暂停您的功能,直到任务完成。因此,如果可能,请考虑使您的功能也异步。代码就像:

public async void Button1_Clicked(object Sender, ...)
{
    var task = MySlowMultiplier(3, 4);
    // while task running you can do other things
    // the UI remains responsive
    // after a while:
    int result = await task;
    ProcessResult(result);
 }

 private async Task<int> MySlowMultiplier(int x, int y)
 {
     // I'm really slow:
     await Task.Delay(TimeSpan.FromSeconds(5));
     return x * y;
 }

答案 2 :(得分:0)

您可以使用此代码。

var result = Task.Run(async() => { return await METHODNAMEHERE(); }).Result;