我的一个应用程序中的后台工作者遇到了一个非常奇怪的问题。我最近稍微修改了一些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事件,并且明显地传递了索引的错误,因为列表没有被填充,因为函数已被跳过。再次,无论我如何将它发布给他们,这在我的电脑上都能完美运行,但在其他电脑上则不然。
感谢您的帮助
答案 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)的答案不在这里,我无法想象要花多长时间才能解决这个问题。