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