0

在我的应用程序中,我正在启动进程(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();

此代码返回一个跨线程错误。

4

2 回答 2

1

你做错了。您应该在不同的线程中执行数据包捕获,仅访问 UI 线程中的 UI 元素。

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

  • 您可以在需要时使用Control.InvokeControl.BeginInvoke编组回 UI 线程
  • 你可以使用BackgroundWorkerwhich 为你做一些事情;您将连接进度报告事件以从正确的线程更新 UI
  • 如果您使用 C# 5 和 .NET 4.5,您可以使用 async/await 在单个异步方法中自动返回 UI 线程
于 2012-10-08T20:48:09.537 回答
0

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

于 2012-10-08T20:51:21.867 回答