Bra*_*onm 6 c# events eventtrigger backgroundworker
在我的一个应用程序中,我遇到了一个非常奇怪的背景工作者问题.我最近稍微修改了一些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();
}
Run Code Online (Sandbox Code Playgroud)
下面是运行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);
}
}
Run Code Online (Sandbox Code Playgroud)
它完全忽略了dowork事件并进入runworkercomplete事件,并且明显地传递了索引的错误,因为列表没有被填充,因为函数已被跳过.再次,这完全适用于我的电脑而不是其他人,无论我如何将它发布给他们.
谢谢你的帮助
Jay*_*ggs 16
我的猜测是,你DoWork正在抛出一个异常,所以你RunWorkerCompleted被召唤了.
请注意,BGW DoWork方法中抛出的异常不会在try ... catch中被捕获RunWorkerCompleted; 相反,模式是检查's 参数中的Error属性是否为空.如果这不是null,则会有例外.RunWorkerCompletedRunWorkerCompletedEventArgs
您可能会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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息和更好的示例,请参阅BackgroundWorker.RunWorkerCompleted事件.