【问题标题】:Using ConfigureAwait() without await [duplicate]在没有等待的情况下使用 ConfigureAwait() [重复]
【发布时间】:2020-05-11 07:12:12
【问题描述】:

我有一个名为 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(false)“工作”意味着什么?它的行为就在方法名称中:Configure Await (false)。您似乎将该方法用作一种技巧,以避免有关不等待可等待的警告。不要在你的代码中添加黑客。以正确的方式做事。有关这方面的建议,请参阅建议的副本。

标签: c# asynchronous async-await task configureawait


【解决方案1】:

ConfigureAwait 方法将只创建一个 ConfiguredTaskAwaitable 结构,async/await 流控制使用该结构来指示任务是否应该在当前同步上下文中继续。它抑制了警告,但问题仍然存在。

如果您想等待“LoadAsync()”完成后再继续“HelloWorld()”中的下一条指令,则应使用“this.LoadAsync().GetAwaiter().GetResult()”而不是“this .LoadAsync()”或“this.LoadAsync().ConfigureAwait(false)”。这比“this.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());
}

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2016-06-24
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2013-11-16
    相关资源
    最近更新 更多