在不同的Thread中更新我的标签并等待结果

时间:2012-10-08 20:43:36

标签: c# winforms

在我的应用程序中,我启动进程(Tshark)并开始捕获,在我完成捕获后,我正在检查创建的文件,并从进程输出解析接收到的数据包的数量,以便更新我的UI。 在这一点上,如果创建的文件很大,所有的UI都会一直停留,直到收到数据包的结果,所以我想在不同的线程中进行。

Capinfos capInfo = new Capinfos(); //my class who return the number of packets
ThreadStart tStarter = delegate {label.Text = capInfo._numberOfPackets.ToString("#,##0"); };
Thread thread = new Thread(tStarter);
thread.IsBackground = true;
thread.Start();

此代码返回交叉线程错误。

2 个答案:

答案 0 :(得分:1)

你这样做是错误的。您应该在另一个线程中执行数据包捕获,只访问UI线程中的UI元素。

有很多不同的方法可以做到这一点。最常见的可能是:

  • 您可以在需要时使用Control.InvokeControl.BeginInvoke编组回UI线程
  • 您可以使用BackgroundWorker为您做一些事情;您将连接进度报告事件以从右侧线程更新UI
  • 如果您使用的是C#5和.NET 4.5,则可以使用async / await在单个异步方法中自动返回UI线程

答案 1 :(得分:0)

您似乎尝试使用UI线程以外的线程(label.Text = ---)更新UI。我认为这可能是问题所在。您可以使用Task来实现异步。在使用Task更新UI线程之前,您可以使用ContinueWith的{​​{1}}方法等待任务完成。 http://msdn.microsoft.com/en-us/library/dd235678.aspx