如何等待async void完成

本文关键字:async void 完成 等待 何等待 | 更新日期: 2023-09-27 18:27:30

我需要等待async void完成。它有一些await Task.Delay函数,我需要它们在继续之前完成。这个void不返回任何内容,所以我看不出有什么理由将其设为async Task<>,我还在这个void中打乱了一个数组,并声明了一些变量。那么我该怎么做呢?async Task<>是唯一的方法吗?我的void不需要任何参数/输入。

如何等待async void完成

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

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

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

ehm,前提是您的函数也被声明为async并返回Task或Task <TResult>,这使得您的客户端都必须是async。

如果您有一个同步函数,并想调用异步函数,请使用以下方法:

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;
 }

您可以使用此代码。

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