2012-03-29 3 views
0

내 Winform 응용 프로그램을 사용하여 내 네트워크 카드에 패킷 버퍼를 보내고 내 응용 프로그램이 진행 막대를 통해 진행하도록 표시합니다. 회색이됩니다.) 그리고 모든 버퍼를 senging 한 후에 만 ​​정상 동작으로 돌아갑니다. (내 버퍼가 50,000 패킷 이상인 경우) 그런 경우 어떻게 처리 할 수 ​​있습니까? maybee는 모든 클래스 속성 (패킷 보내기 횟수 등)을 이벤트로 확인하는 백그라운드 워커를 변경 하시겠습니까? 여기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는) :

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

내 업데이트 참조하십시오. 내게 무슨 뜻인지 보여 줄 수 있습니까? – user979033

+0

당신이해야 할 일은 typeCast뿐입니다. var pcapInstance = (Pcap) e.UserState; 이제 전체 데이터에 액세스 할 수 있습니다. 이게 니가 원하는거야? – Prakash

0

아이디어는 BGWorker를 사용하는 PacketSender 클래스를 가지고 있으며, 그것에 레지스터 진행 이벤트, 등, 그리고의 바인딩/청취를 허용하기 위해 진행 속성 또는 이벤트 자체를가집니다.

그러면 PacketSender 클래스는 큰 작업을 수행하고 BGWorker가 수행하게합니다. BGWorker-Work 메서드는 별도의 스레드에 있으며, ReportProgress를 호출 할 때마다 주 스레드의 PacketSender에서 청취 메서드로 가져와 PacketSender.ProgressChanged 수신기 위로 버블 링 할 수 있습니다 또는 퍼센트 완료의 ProgressChanged 속성을 변경하십시오.

올바른 방법은 PacketSender ctor에서 작업에 대한 데이터를 얻고 즉시 BGWorker를 시작하여 동일한 PacketSender에서 여러 작업을 수행하지 못하게하고, 또는 BGWorker가 작동하는지 확인하고 단일 PacketSender의 멀티 태스킹을 방지하는 시작 및 중지 메소드가 있습니다.

0

여기에서 BackgroundWorker를 사용하는 것이 더 좋습니다. 진행률 표시 줄을 업데이트하기 위해 맞춤 이벤트를 정의하는 것보다 새롭고 더 좋습니다. MSDN을 확인하십시오.

관련 문제