2012-03-16 54 views
0

我有Winform應用程序誰運行列表框中的所有文件, 我使用Pcapdotnet DLL發送數據包到我的網絡適配器,過程是,我正在採取Wireshark捕獲文件並用這個文件發送所有的數據包。 每個文件將與BackgroundWorker的運行,它的下一次完成了我的列表框srart後運行等 我添加了一個複選框,選中此複選框處於選中狀態的所有文件在同一時間同時運行。 時,它的運行我的應用程序崩潰與錯誤:異常已通過調用的目標拋出:有錯誤的應用程序崩潰異常已拋出目標

static void Main() 
{ 
    Adapters addr = new Adapters(); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new mainWindow()); 
} 

在上線收到的錯誤(Application.Run(新的主窗口());)

這是我的代碼誰處理中同時運行:

 for (int i = 0; i < listBoxFiles.Items.Count; i++) 
     { 
      string filePath = (string)listBoxFiles.Items[i]; 
      playCount = 0; 

      BackgroundWorker bgWsim = new BackgroundWorker(); 
      bgWsim.WorkerReportsProgress = true; 
      bgWsim.ProgressChanged += new ProgressChangedEventHandler(bgW_ProgressChanged); 
      bgWsim.DoWork += new DoWorkEventHandler(
      (s3, e3) => 
      { 
       while ((playCount < numberOfLoops) && (bContinuePlay)) //play the capture 
       { 
        for (int k = 0; (k < listBoxFiles.Items.Count) && (bContinuePlay); k++) 
        { 
         class = new myClass(filePath , playSpeed); 

         class.evePacketProgress += new class.dlgPacketProgress(
          (progressCount) => 
          { 
           bgWsim.ReportProgress(progressCount, class); 
          }); 

         if (selectedAdapter != null) 
         { 
          bContinuePlay = class.playCapture(selectedAdapter._packetDevice); 
         } 

         playCount++; 
         Thread.Sleep((int)delay); 
        } 
       } 
      }); 

      bgWsim.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
      (s3, e3) => 
      { 
       groupBoxSelect.Enabled = true; 
       groupBoxOptions.Enabled = true; 
       groupBoxInfo.Enabled = true; 
       btnPlay.Enabled = true; 
      } 
      ); 

      bgWsim.RunWorkerAsync(); 
     } 

如何調試這個錯誤,並發現問題?

錯誤截圖:

http://i42.tinypic.com/2ainbqp.jpg

+1

您可以通過按F5和使用斷點調試這個錯誤。 – 2012-03-16 16:09:32

+0

你從哪裏得到例外?似乎是一個mulithreading問題與WinForms控件 – munissor 2012-03-16 16:10:26

+0

看到我的更新,代碼添加 – user1269592 2012-03-16 16:17:21

回答

0

ProgressBar具有用於定義值它將接受(默認爲0〜100)的範圍MaximumMinumum性質。如果您嘗試將Value屬性設置爲範圍之外的數字,則會拋出ArgumentException。見here

+0

我的ProgressBar是我的問題? – user1269592 2012-03-16 16:33:47

+0

您傳遞給它的值。我懷疑你在'bgW_ProgressChanged'方法(你已經定義爲你的'ProgressChangedEventHandler')中這樣做了。一種方法是將你的'progressCount'變量表示爲一個百分比(因此它是一個範圍爲0-100的數字),並將其傳遞給'bgWsim.ReportProgress()'。 – raveturned 2012-03-16 16:38:00

+0

請參閱您的堆棧跟蹤的開始 - 在'System.Windows.Forms.progressBar.set_Value(的Int32值)',和你的異常消息說的「101」'值是無效的「值」。 「價值」應介於「最低」和「最高」之間。 – raveturned 2012-03-16 16:42:37

0

我認爲這個問題是因爲它的RunWorkerCompleted事件由異步thread.You需要修改自己的線程Windows窗體控件,你可以通過調用控制做這個調用。

例子:(與拉姆達)

 private static void runOnThread(Control x, Action logic) 
    { 
     if (x.InvokeRequired) 
     { 
      x.Invoke(logic); 
     } 
     else 
     { 
      logic(); 
     } 
    } 

你會調用這個作爲follwed:

runOnThread(groupBoxSelect,() => groupBoxSelect.Enabled = true);