【问题标题】:Application crash with error Exception has been thrown by the target应用程序崩溃错误异常已被目标抛出
【发布时间】:2012-04-02 04:40:31
【问题描述】:

我有运行列表框中所有文件的 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();
        }

如何调试此错误并找到问题所在?

错误截图:

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

【问题讨论】:

  • 您可以通过按 F5 并使用断点来调试此错误。
  • 你从哪里得到异常?似乎是 winforms 控件的多线程问题
  • 你能给我们完整的异常文本和堆栈跟踪吗?
  • 崩溃发生在我开始运行所有文件后,有时在几秒钟后发生,有时在几分钟后发生
  • 我该怎么做? (异常文本和堆栈跟踪)

标签: c# winforms


【解决方案1】:

ProgressBar 具有 MaximumMinumum 属性,用于定义它将接受的值的范围(默认为 0 到 100)。如果您尝试将 Value 属性设置为超出范围的数字,则会引发 ArgumentException。见here

【讨论】:

  • 我的 ProgressBar 是我的问题?
  • 您传递给它的值。我怀疑您是在您的 bgW_ProgressChanged 方法中执行此操作(您已将其定义为您的 ProgressChangedEventHandler)。一种方法是将您的 progressCount 变量表示为百分比(因此它将是 0-100 范围内的数字),然后将其传递给 bgWsim.ReportProgress()
  • 查看堆栈跟踪的开头 - at System.Windows.Forms.progressBar.set_Value(Int32 value),您的异常消息显示为 Value of '101' is not valid for 'Value'. 'Value' should be between 'minimum' and 'maximum'.
  • 非常感谢,现在可以了,我禁用了 ProgressBar,无论如何在同步模式下没有任何意义
【解决方案2】:

我认为问题在于 RunWorkerCompleted 事件,因为它由异步线程调用。您需要在自己的线程上从 Windows 窗体编辑控件,您可以通过调用控件来做到这一点。

示例:(使用 lambda)

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

你会这样称呼它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    相关资源
    最近更新 更多