如何等待 async void 完成?

How to wait for async void to complete?

我需要等待 async void 完成。它有一些 await Task.Delay 功能,我需要它们在继续之前完成。这个 void 没有 return 任何东西,所以我看不出有什么理由让它成为 async Task<> 并且我还在这个 void 中洗牌了一个数组并声明了一些变量。那我该怎么做呢? async Task<> 是唯一的方法吗?我的 void 不期待任何 parameters/inputs.

Return Task (not Task<T>) 而不是 void。请注意,Task 的非泛型形式不需要包装值。它仅用于指示完成或错误,而不是结果。在 async 方法的情况下,这等同于同步 void return 类型。这意味着您可以等待您的方法完成。

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

因此,如果您的异步函数不是事件处理程序,它应该 return 任务。完成后,您可以等待它...

...嗯,前提是你的函数也被声明为异步和 returns Task 或 Task<TResult>,这使得你的客户端都必须是异步的。

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

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;