我的一个应用程序中的后台工作人员遇到了一个非常奇怪的问题。我最近通过一些GUI修复对其进行了大修,但是现在当另一台PC上的某人运行.exe或安装我的OneClick部署时,后台工作程序不会进入dowork事件。在2个发行版之间,逻辑没有改变。我已经进行了比较,除了添加了更多错误日志记录外,没有任何变化。

我已经尽力在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事件的代码。为了简单起见,Ive删除了它执行的其他功能。它所要做的就是运行一个返回字符串并将其放置在名为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事件,并为索引传递了一个错误,这显然是因为列表没有被填充,因为函数do被跳过了。再次,这在我的PC上完美运行,但无论我如何将其发布给其他人,都无法正常运行。

感谢您的协助

最佳答案

我的猜测是您的DoWork引发异常,因此您的RunWorkerCompleted被调用。

请注意,在BGW的DoWork方法中引发的异常不会在RunWorkerCompleted的try ... catch中捕获;相反,该模式是检查ErrorRunWorkerCompleted参数中的RunWorkerCompletedEventArgs属性是否不为null。如果不为null,则有一个异常(exception)。

您可以这样修改RunWorkerCompleted代码:

public void Scan_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    if (e.Error != null) {
        // You have an exception, which you can examine through the e.Error property.
    } else {
        // No exception in DoWork.
        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);
        }
    }
}

有关更多信息和更好的示例,请参见BackgroundWorker.RunWorkerCompleted Event

关于C#后台 worker 不触发除我自己以外的任何PC上的dowork事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8253790/

10-09 09:19