c# - 一路async await async

标签 c# .net async-await task-parallel-library wait

我是 c# 异步等待机制的新手。一路看了一些关于async的文章(http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)。我在下面有一个例子,你能告诉我第一个 Initialize 方法是否会导致死锁,为什么?提前谢谢你。

public class Test {

    public  async  Task DoSomeWorkAsync() {
      await DoSomeWork1Async(); 
    }

    // This method is mixed with Wait and async await, will this cause lead lock?
    public void Initialize() {
      Task.Run(() => DoSomeWorkAsync()).Wait();
    }

    // This method is following async all the way
    public async Task InitializeAsync()  {
      await DoSomeWorkAsync();
    }

}

// Update: Here is the context where two Initialize methods are called
public class TestForm : Form {
  // Load Form UI
  public async void OnLoad() {
    var test = new Test();
    test.Initialize();
    await test.InitializeAsync();
  }
}

最佳答案

不,这不会死锁,因为您阻塞了ThreadPool 线程执行且没有SynchronizationContext 的任务。由于它不在 UI 线程上运行,因此没有什么可以阻止该任务完成,因此不存在死锁。

如果这是你的代码,它会死锁:

public void Initialize()
{
    DoSomeWorkAsync().Wait();
}

虽然这仍然不是阻止的好理由,但您应该一直使用 async-await。

关于c# - 一路async await async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32188568/

相关文章:

c# - DTO 中的枚举类型命名约定

c# - 如何在c#中将PDF转换为WORD

c# - 使用 .Result 的异步方法

c# - 用于具有动态输入控件的 silverlight 页面的 MVVM

c# - Linq 到 SQL : Dynamic insert during an update to another entity

c# - .Net Core 3.1 使用 MySql 向现有项目添加身份

c# - 是否可以在自动化中将整个测试套件作为迭代运行?

c# - 如何知道任务是否同步完成?

javascript - 异步函数到底是函数还是 Promise 对象?

c# - 为什么等待任务有时会阻塞?