我的一个应用程序中的后台工作人员遇到了一个非常奇怪的问题。我最近通过一些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中捕获;相反,该模式是检查Error
的RunWorkerCompleted
参数中的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/