源码如下:
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");}
亲测,可以正常工作。
在此特别感谢七里听香和林德桢二位大佬的指点!
想进技术交流群的加微信zls20210502(可以扫描下方二维码),这里没有套路,没有广告,只为打造纯净的技术交流群,(想进群捣乱打广告的免加,会有技术考核,别白费心思)