我是c#异步等待机制的新手。我读了一些关于异步(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();
}
}发布于 2015-08-24 18:04:12
不,这不会死锁,因为您正在阻塞一个由没有ThreadPool SynchronizationContext.的线程执行的任务因为它没有在UI线程上运行,所以没有什么能阻止任务的完成,所以也没有死锁。
如果这是您的代码,它将陷入僵局:
public void Initialize()
{
DoSomeWorkAsync().Wait();
}但是,这仍然不是阻止的好理由,您应该使用异步等待所有它们的方式。
https://stackoverflow.com/questions/32188568
复制相似问题