我有一个名为 Load 的方法,它正在从同步方法调用:
private async Task LoadAsync()
{
await Task.Run(() => // stuff....).ConfigureAwait(false);
}
public void HelloWorld()
{
this.LoadAsync(); // this gives me a suggestion/message, "because this call is not awaited,.... consider using await.
}
我能够通过这样做删除建议消息:
this.LoadAsync().ConfigureAWait(false);
没有 await 关键字,ConfigureAwait(false( 是否仍然有效(方法中的 Task.Run 将异步运行(?
ConfigureAwait 方法将只创建一个 ConfiguredTaskAwaitable 结构,async/await 流控制使用该结构来指示任务是否应该在当前同步上下文中继续。它禁止显示警告,但问题仍然存在。
如果你想等待"LoadAsync(("完成,然后再继续"HelloWorld(("中的下一条指令,你应该使用"this.LoadAsync((.GetAwaiter((。GetResult(("而不是"this.LoadAsync(("或"this.LoadAsync((.ConfigureAwait(false("。这比"这个"要好。LoadAsync((.Wait((",因为任何异常都将作为抛出接收,而不是获取 AggregateException。但请注意,该任务可能会在"HelloWorld(("的同一同步上下文中运行,从而导致死锁。
public void HelloWorld()
{
this.LoadAsync().GetAwaiter().GetResult();
}
但是,如果您希望"HelloWorld(("在"LoadAsync(("仍在运行时完成,则可以使用"Task.Run(async (( => await this。LoadAsync(((".
public void HelloWorld()
{
Task.Run(async () => await this.LoadAsync());
}