C#中等待线程执行线束时遇到的问题总结

今天在Windows Form程序中尝试使用多线程更新UI的时候遇到了一个很让人蛋疼的问题, 先把之前的代码贴出来:

        
// 按钮响应方法
private void button2_Click(object sender, EventArgs e) { OpenFileDialog file = new OpenFileDialog(); file.Filter = "Excel file|*xls;*xlsx"; if (file.ShowDialog() == System.Windows.Forms.DialogResult.OK) { strDstFileName = file.FileName; lv_DstFileName.Items.Add(file.FileName); m_DstExcelApp = new MyExcel(strDstFileName); Task task1 = Task.Factory.StartNew(() => { if (m_DstExcelApp.Open(strDstFileName) == true) { DisplayInfo(strDstFileName + " File was loaded successfully!"); } }); task1.Wait(); if (lv_SrcFileName.Items.Count >= 1 && lv_DstFileName.Items.Count >= 1) { button3.Enabled = true; } } }
    // 线程中更新UI时使用委托这些都没有错
private delegate void DisplayInfoInvoke(string strtext); private void DisplayInfoFunc(string text) { tb_HandlingInfoDisplay.Text += text + "\r\n"; } private void DisplayInfo(string strText) { DisplayInfoInvoke invoke = new DisplayInfoInvoke(DisplayInfoFunc); this.Invoke(invoke, new object[] { strText }); }

这段代码看上去应该没有任何错误, 可是在运行的时候却出现了一个很奇怪的现象, 就是在执行到

this.Invoke(invoke, new object[] { strText });
这里时即死掉了, 就是没有了反应。 一开始不知道, 我以前多次做过这个, 没出现过这样的问题啊, 后来排查了半天, 在尝试将task1.Wait()注销以后, 程序竟然就又能够正常执行了, 可现实情况是, 我这个执行过程必需得要用到等待工作线程执行完了以后才能进行下一步操作, 网上搜了半天也没找到是什么原因, 后来看到网上有关于在线程中更新UI的贴子, 里面的代码和我的代码其实唯一的区别是将
this.Invoke(invoke, new object[] { strText });
替换为:
this.BeginInvoke(invoke, new object[] { strText });
我就死马当活马医就改了一下, 结果竟然程序又能够正常执行了, 虽然问题似乎是找到了, 可是具体是什么原因自己也搞不清楚, 希望有哪位大神知道的, 给我解释一下, 感激不尽。
下面是园子里有一则帖子讲Invoke和BeginInvoke区别的:
http://www.cnblogs.com/mashang/archive/2009/08/01/1536730.html
讲的很全面, 可是对于我这个问题也还是不甚明了。
posted @ 2013-09-05 19:04  拾贝壳  阅读(396)  评论(0编辑  收藏  举报