我有运行listbox中所有文件的Winform应用程序, 我正在使用Pcapdotnet DLL将数据包发送到我的网络适配器,过程是我正在使用Wireshark捕获文件并使用此文件发送所有数据包。 每个文件都将与BackgroundWorker一起运行,并在下次完成后在我的列表框srart中运行等等。 我添加了一个复选框,当此复选框处于选中状态时,所有文件同时在同一时间运行。 当它运行时我的应用程序崩溃并出现错误:调用目标抛出了异常:
static void Main()
{
Adapters addr = new Adapters();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new mainWindow());
}
最后一行收到的错误(Application.Run(new mainWindow());)
这是我同时运行的代码:
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();
}
如何调试此错误并找到问题?
错误截图:
答案 0 :(得分:0)
ProgressBar具有Maximum
和Minumum
属性,用于定义它将接受的值范围(默认值为0到100)。如果您尝试将Value
属性设置为范围之外的数字,则会抛出ArgumentException。请参阅here。
答案 1 :(得分:0)
我认为问题是RunWorkerCompleted事件,因为它是由异步线程调用的。你需要在自己的线程上编辑来自Windows Forms的控件,你可以通过调用控件来完成。
示例:(使用lambda)
private static void runOnThread(Control x, Action logic)
{
if (x.InvokeRequired)
{
x.Invoke(logic);
}
else
{
logic();
}
}
您可以将其称为以下内容:
runOnThread(groupBoxSelect,() => groupBoxSelect.Enabled = true );