C# 无意间写了一段线程死锁的代码

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 无意间写了一段线程死锁的代码相关的知识,希望对你有一定的参考价值。

源码如下:

 private void action_Click(object sender, RoutedEventArgs e) { Task t = new Task(() => { for (int i = 0; i < 10; i++) { Thread.Sleep(1000); this.Dispatcher.Invoke(() => { lblStr.Content = i.ToString(); }); manualResetEvent.Set(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); } }); t.Start(); t.Wait(); MessageBox.Show("123"); }

正常屏蔽掉t.Wait();时,点击按钮,界面label会显示1到9,间隔1秒,

但是加上 t.Wait();直接就卡这里了。

修改为用ManualResetEvent等待,也是一样的效果

 ManualResetEvent manualResetEvent = new ManualResetEvent(false);
private void action_Click(object sender, RoutedEventArgs e) { Task t = new Task(() => { for (int i = 0; i < 10; i++) { Thread.Sleep(1000); this.Dispatcher.Invoke(() => { lblStr.Content = i.ToString(); }); manualResetEvent.Set(); } }); t.Start(); //t.Wait(); manualResetEvent.WaitOne(); MessageBox.Show("123"); }



然后在群里请教了几位大佬,大佬说是死锁了,指导用async和await去做

 private void action_Click(object sender, RoutedEventArgs e) { TaskTest(); }
public async void TaskTest() { await Task.Run(() => { for (int i = 0; i < 10; i++) { Thread.Sleep(1000); this.Dispatcher.Invoke(() => { lblStr.Content = i.ToString(); }); } }); MessageBox.Show("123"); }

亲测,可以正常工作。

在此特别感谢七里听香和林德桢二位大佬的指点!



以上是关于C# 无意间写了一段线程死锁的代码的主要内容,如果未能解决你的问题,请参考以下文章

对一个死锁问题的思考

C#中lock死锁

用新学的知识 写了一段小代码

随手写了一段C++访问LDAP, 并且获取sid的代码

vscode用啥符号把某一段代码包起来,类似C#的#region?

线程死锁的思考