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

我的一个应用程序中的后台工作者有一个非常奇怪的问题。 我最近稍微修改了一些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事件的代码。 我已经删除了它为简单起见所做的其他function。 它所做的就是运行一个函数,该函数返回一个字符串并将其放在名为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(); 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事件并且明显地传递了索引的错误,因为列表没有被填充,因为函数已被跳过。 再次,这完全适用于我的电脑,但不管其他人如何将其发布给他们。

谢谢你的帮助

我的猜测是你的DoWork抛出一个exception,所以你的RunWorkerCompleted被调用了。

请注意,在RunWorkerCompleted ,不会在try … catch中捕获BGW的DoWork方法中引发的exception; 相反,该模式是检查RunWorkerCompletedRunWorkerCompletedEventArgs参数中的Error属性是否为null。 如果这不是null,则会有例外。

您可能会像下面这样修改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事件 ,这是一个比我更好的示例。