mac*_*Jun 1 .net c# wait task-parallel-library async-await
我是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();
}
}
Run Code Online (Sandbox Code Playgroud)
不,这不会死锁,因为你正在阻止一个没有的ThreadPool线程执行SynchronizationContext的任务.由于它没有在UI线程上运行,因此没有任何事情可以阻止该任务完成,因此没有死锁.
如果这是你的代码,它将陷入僵局:
public void Initialize()
{
DoSomeWorkAsync().Wait();
}
Run Code Online (Sandbox Code Playgroud)
这仍然不是阻止的好理由,你应该使用async-await all up up up.