如何等待async void完成
本文关键字:async void 完成 等待 何等待 | 更新日期: 2023-09-27 18:27:30
我需要等待async void
完成。它有一些await Task.Delay
函数,我需要它们在继续之前完成。这个void不返回任何内容,所以我看不出有什么理由将其设为async Task<>
,我还在这个void中打乱了一个数组,并声明了一些变量。那么我该怎么做呢?async Task<>
是唯一的方法吗?我的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;