C#后台工作者除了我自己以外没有触发任何电脑上的dowork事件

时间:2011-11-24 08:01:54

标签: c# events backgroundworker eventtrigger

我的一个应用程序中的后台工作者遇到了一个非常奇怪的问题。我最近稍微修改了一些GUI修复程序,但现在当另一台PC上的某人运行.exe或安装我的OneClick部署时,后台工作程序不会进入dowork事件。两个版本之间的逻辑没有改变。我做了一个比较,除了添加更多的错误记录,没有任何改变。

我已经在dowork事件中包含了消息框和断点,但除了我自己的PC之外,它从未进入任何地方。即使我远程调试它也不会进入DoWork事件

有什么建议吗?

按钮单击甚至调用runworkerasync事件

private void ScanButton_Click_1(object sender, RoutedEventArgs e)
    {

        Scan = new BackgroundWorker();
        Scan.WorkerReportsProgress = true;
        Scan.DoWork += new DoWorkEventHandler(Scan_DoWork);
        Scan.ProgressChanged += new ProgressChangedEventHandler(Scan_ProgressChanged);
        Scan.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Scan_RunWorkerCompleted);
        Scan.RunWorkerAsync();
    }

以下是运行DoWork事件的代码。我已经删除了它为简单起见所做的其他功能。它所做的就是运行一个函数,该函数返回一个字符串并将其放在名为scanresults的列表中。

private BackgroundWorker Scan;

    public void Scan_DoWork(object sender, DoWorkEventArgs e)
    {

        System.Windows.Forms.MessageBox.Show("Inside the DoWork");

        BackgroundWorker bw = sender as BackgroundWorker;

        float percentageDone = 0.0F;

        ScanResults = new List<string>();

        try
        {

            System.Windows.Forms.MessageBox.Show("Doing first scan check");

            ScanResults.Add(Functions.LocalComputerName());
            percentageDone = ((1 / 1f) * 100f);
            bw.ReportProgress((int)percentageDone);

        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }


public void Scan_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
            if (ScanResults.Count == 0)
            {
                System.Windows.Forms.MessageBox.Show("Empty");
                return;
            }
            MachineNameBox.Text = ScanResults[0];
        }
        catch (Exception ex)
        {
            System.Windows.MessageBox.Show(ex.Message, "Error Encountered", MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }
    }

它完全忽略了dowork事件并输入了runworkercomplete事件,并且明显地传递了索引的错误,因为列表没有被填充,因为函数已被跳过。再次,无论我如何将它发布给他们,这在我的电脑上都能完美运行,但在其他电脑上则不然。

感谢您的帮助

3 个答案:

答案 0 :(得分:16)

我的猜测是您的DoWork正在抛出异常,因此您的RunWorkerCompleted被调用。

请注意,BGW的DoWork方法中抛出的异常不会在RunWorkerCompleted中的try ... catch中捕获;相反,模式是检查Error的{​​{1}}参数中的RunWorkerCompleted属性是否为空。如果这不是null,则会有例外。

您可以像这样重写RunWorkerCompletedEventArgs代码:

RunWorkerCompleted

请参阅BackgroundWorker.RunWorkerCompleted Event了解更多信息以及比我更好的示例。

答案 1 :(得分:0)

对我来说,这是我的主项目已签名,而我引入的新DLL没有。这很奇怪,因为我从未收到警告或错误,并且项目编译正常。只是background_dowork()永远不会在调试中被击中。一旦我在DLL上添加了签名证书,就可以启动backgroundworker。

答案 2 :(得分:0)

杰伊·里格斯(Jay Riggs)的答案是正确的,但我只是想补充一下,由于DoWork中的某些问题引起的异常甚至都不会被try...catch中的DoWork捕获,这对我来说真是太神奇了。

我遇到一种情况,我的DoWork例程使用了第三方库,而后者又使用了另一个缺少的库。当我的应用程序调用{​​{1}}时,即使没有立即使用该库,即使整个方法都包装在DoWork 中,它在方法外部 失败,并调用try...catch,好像一切都很好。因此,后台作业什么也不做,也没有引发异常,它只是将异常悄悄地放在了RunWorkerCompleted属性中,而我一直在忽略它,因为我从来不知道。这需要一些非常仔细的调试才能发现。

我的收获是,您始终需要检查Error中的错误,并且这是非常违反直觉的行为。如果杰伊·里格斯(Jay Riggs)的答案不在这里,我无法想象要花多长时间才能解决这个问题。