C#异步死锁 - 为什么会发生这种情况

时间:2017-07-26 14:47:45

标签: c# asp.net async-await deadlock visual-studio-lightswitch

我有一个ASP.Net应用程序(实际上Lightswitch涉及到这里,不确定在这种情况下它是否重要)。

我有以下代码。它从LogIn.aspx开始,它在OnLoggedIn事件上调用RegisterUser。

//example code
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView){
    let customCallout = CustomCallout(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width * 0.8, height: 50))
   customCallout.backgroundColor = UIColor.red //your color here
   view.addSubView(customCallout)
   //adjust any param you need here
}

异步代码死锁。我试图在一个单独的帖子中运行它,我不是故意等待它。

将对RegisterUserAsync的调用更改为此(在启动线程之前适当捕获SQL):

  

Task.Run(()=> RegisterUserAsync(userName,user.FullName,   user.ClientId,user.ClientName));

解决问题。我理解为什么调用Task.Run解决了你想要等待而没有死锁的异步调用,但我不明白为什么在这种情况下发生了死锁。 (Initializing变量为false - 我记录了一个调试语句以确保,因此它实际上从未实际执行过Thread.Yield,但我不知道为什么会影响它。)

为什么旧代码中发生了死锁?

0 个答案:

没有答案