源码如下:
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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。