首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步等待异步

异步等待异步
EN

Stack Overflow用户
提问于 2015-08-24 17:51:48
回答 1查看 448关注 0票数 1

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

代码语言:javascript
复制
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();
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-24 18:04:12

不,这不会死锁,因为您正在阻塞一个由没有ThreadPool SynchronizationContext.的线程执行的任务因为它没有在UI线程上运行,所以没有什么能阻止任务的完成,所以也没有死锁。

如果这是您的代码,它将陷入僵局:

代码语言:javascript
复制
public void Initialize()
{
    DoSomeWorkAsync().Wait();
}

但是,这仍然不是阻止的好理由,您应该使用异步等待所有它们的方式。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32188568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档