源码如下:

        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(可以扫描下方二维码),这里没有套路,没有广告,只为打造纯净的技术交流群,(想进群捣乱打广告的免加,会有技术考核,别白费心思)

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注