2012-03-29 9 views
0

私のWinformアプリケーションを使用してネットワークカードにパケットのバッファを送信しています。私のアプリケーションはスタックされていません。灰色になります)、すべてのバッファを読み込んだ後にのみ正常な動作に戻ります(バッファが非常に大きい場合は50,000パケット以上) どうすればこのようなケースに対処できますか?私のクラスのプロパティ(パケットの数など)をイベントでチェックするバックグラウンド作業者を変更するかどうかbackgroundworker vsイベント

listBoxFiles.SetSelected(0, true); 
    bgWoSingle = new BackgroundWorker(); 
    bgWoSingle.WorkerReportsProgress = true; 
    bgWoSingle.ProgressChanged += new ProgressChangedEventHandler(bgW_ProgressChanged); 
    bgWoSingle.DoWork += new DoWorkEventHandler(
    (s3, e3) => 
    { 
     while (loopsCount < numberOfLoops && bContinuePlay && ifContinue) 
     { 
      for (int i = 0; (i < listBoxFiles.Items.Count) && bContinuePlay && ifContinue; i++) 
      { 
       this.Invoke((MethodInvoker)delegate 
       { 
        lbCurrentFileNum.Text = "(" + (i + 1) + "/" + listBoxFiles.Items.Count + "):"; 
       }); 

       string path = (string)listBoxFiles.Items[i]; 
       pcap = new Pcap(path, playSpeed, isSync); 
       pcap._startTimer += new EventHandler(pcap_packetStartTimer); 
       pcap._stopTimer += new EventHandler(pcap__packetStopTimer); 
       pcap.evePacketProgress += new Pcap.dlgPacketProgress(
        (progressCount) => 
        { 
         pcap._fileSelectedIndex = i; 
         bgWoSingle.ReportProgress(progressCount, pcap); 
        }); 

       if (selectedAdapter != null) 
       { 
        //play the file 
        bContinuePlay = pcap.playCapture(selectedAdapter._packetDevice);      } 
      } 

      loopsCount++; 
     } 

    bgWoSingle.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
     (s3, e3) => 
     { 

     } 
     ); 

    bgWoSingle.RunWorkerAsync(); 

ここで私は(クラス名がPCAPである)クラスのプロパティを確認:アイデアがBGWorkerを使用していますPacketSenderクラスを持つことであり、それへの登録は、進行中のイベント、などだ

void bgW_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    //check the properties and update the UI 
    labelPacketSent.Text = pcap._numberOfSendPackets.ToString("#,##0"); 
    progressBar1.Value = e.ProgressPercentage; 
} 

答えて

1

BackGroundWorkerを使用する必要があります。私はそれのための小さな例を追加しています。

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
     backgroundWorker.ReportProgress(80, 15000); 
} 

private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    var numberOfPackets = int.parse(e.UserState); 

    MessageBox.Show("Percentage: " + e.ProgressPercentage); 
    MessageBox.Show("Packets sent :" + numberOfPackets); 
} 

作業者は、完了の割合やその他のデータをUserStateから送信できます。

+0

現在、私のBackgroundWorkerはメインスレッドのもので、パケットを送信するcalssを確認しています – user979033

+0

私のupdaeを見て、あなたが何を意味するのか教えてください。 – user979033

+0

あなたがしなければならないのは、タイプキャストです。 var pcapInstance =(Pcap)e.UserState;これで、すべてのデータにアクセスできます。これは、あなたの望むことですか? – Prakash

0

、およびバインディング/リスニングを可能にするために、進行状況のプロパティまたはそれ自身のイベントがあります。

そして、PacketSenderクラスは大きな仕事を受け取り、BGWorkerに任せます。あなたのBGWorker-Workメソッドは別のスレッド上にあり、その中からReportProgressを呼び出すたびに、メインスレッドのPacketSenderのリスニングメソッドで取得し、それをPacketSender.ProgressChangedリスナーに上にバブルできるようになりますパーセンテージの完了などのProgressChangedプロパティを変更する

正しい方法は、PacketSender ctorでタスクのデータを取得し、直ちにBGWorkerを起動して、同じPacketSenderで複数のタスクを実行しないようにすることです。またはBGWorkerが動作しているかどうかをチェックし、単一のPacketSenderのマルチタスキングを防止するStartメソッドとStopメソッドを持つことができます。

0

ここでBackgroundWorkerを使用してください。プログレスバーを更新するためのカスタムイベントの定義よりも新しく優れています。 MSDNを確認してください。

関連する問題