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 スレッドにマーシャリングすることができます。
  • BackgroundWorkerこれの一部を実行する whichを使用できます。進行状況レポート イベントをフックして、適切なスレッドから UI を更新します。
  • C# 5 と .NET 4.5 を使用している場合は、async/await を使用して、単一の非同期メソッド内で UI スレッドに自動的に戻ることができます。
于 2012-10-08T20:48:09.537 に答える
0

UI スレッド ( ) 以外のスレッドを使用して UI を更新しようとしているようですlabel.Text = ---。多分それが問題だと思います。s を使用Taskして非同期を実現できます。を使用して UI スレッドを更新する前に、TaskContinueWithメソッドを使用してタスクが終了するのを待つことができますBeginInvokehttp://msdn.microsoft.com/en-us/library/dd235678.aspx

于 2012-10-08T20:51:21.867 に答える