本文演示了如何使用 efficient 添加无死锁异步代码。ConfigureAwait(false)
考虑一个示例,其中用户希望在方法中异步加载数据。
/// <summary>
/// Old approach with classic async await
/// </summary>
/// <returns></returns>
public async static Task OldApproach()
{
await ReadDataAsync();
}
在这种方法中,await 运算符等待,然后在从它开始的同一同步上下文中继续执行ReadDataAsync
当开发人员确保在单独的线程中执行 UI 更新时,将使用上述方法。但是,它可能会引入潜在的死锁风险。
让我们使用ConfigureAwait(false)
/// <summary>
/// Optimized approach with ConfigureAwait
/// </summary>
/// <returns></returns>
public static async Task OptimizedApproachAsync()
{
await ReadDataAsync().ConfigureAwait(false);
}
通过添加此内容,编译器不会在同一同步上下文中添加执行,从而减少了死锁的可能性。
上述优化在库代码等非 UI 应用程序中是有益的。
请在下面找到使用方法的好处ConfigureAwait(false)
由于优化的方法不会将执行添加到相同的同步上下文中,因此可以节省额外的开销,并有助于创建可扩展的应用程序。
ConfigureAwait(false)方法可降低同步上下文被阻止时出现死锁的风险。
C# 中的方法旨在生成高效、避免死锁的异步代码。它的优点在非UI应用程序和库项目中特别有用。ConfigureAwait(false)
源代码获取:公众号回复消息【code:30150
】