抛出异常时,C# Backgroundwork 不调用 e.Error
C# Backgroundwork does not call e.Error when exception is thrown
我有一个后台工作人员:
private readonly BackgroundWorker _importWorker = new BackgroundWorker() { WorkerReportsProgress = true };
在我的构造函数中我这样做:
_importWorker.DoWork += _importWorker_DoWork;
_importWorker.ProgressChanged += _importWorker_ProgressChanged;
_importWorker.RunWorkerCompleted += _importWorker_RunWorkerCompleted;
以下是代表们:
private void _importWorker_DoWork(object sender, DoWorkEventArgs e)
{
var args = (object[]) e.Argument;
var walletColumnName = (string) args[0];
var fundColumnName = (string) args[1];
var isinColumName = (string) args[2];
var marketValueDirtyColumnName = (string) args[3];
var seperator = (string) args[4];
var importFilePath = (string) args[5];
var importFile = Path.GetFileName(importFilePath);
var onePercent = 100.0 / File.ReadLines(importFilePath).Count();
var totalPercentage = 0.0;
var parser = new TextFieldParser(importFilePath);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(seperator);
//Read colum indexes on the first line
var fields = parser.ReadFields();
var walletColumnIndex = Array.IndexOf(fields, walletColumnName);
var fundColomnIndex = Array.IndexOf(fields, fundColumnName);
var isinColumnIndex = Array.IndexOf(fields, isinColumName);
var marketValueDirtyColumnIndex = Array.IndexOf(fields, marketValueDirtyColumnName);
if (walletColumnIndex == -1 || fundColomnIndex == -1 || isinColumnIndex == -1 ||
marketValueDirtyColumnIndex == -1)
{
throw new ArgumentException("Eén of meerdere kolommen niet gevonden in " + importFile);
}
//TODO
e.Result = importFile;
}
private void _importWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Progress = e.ProgressPercentage;
}
private void _importWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
Messenger.Default.Send(e.Error);
}
else if (e.Result != null)
{
PenultimateImportFileName = LastImportFileName;
PenultimateImportDate = LastImportDate;
LastImportFileName = e.Result.ToString();
LastImportDate = ImportDate;
_dataContainer.UpdateImportSettings(_importSettings);
}
Progress = 100;
IsBusy = false;
}
抛出异常时,backroundworker 不会调用e.Error,而是应用程序崩溃。这是否正常,如何解决?我读到 E.Error 在 dowork 中抛出未处理的异常时自动调用。
我是这样称呼后台工作人员的:
_importWorker.RunWorkerAsync(new object[] {WalletColumnName, FundColumnName, IsinColumName, MarketValueDirtyColumnName, Seperator, s});
编辑
调试器确实中断并抛出了我在代码中抛出的异常:
System.ArgumentException was unhandled by user code
HResult=-2147024809
Message=Eén of meerdere kolommen niet gevonden in 021214-0.txt
Source=Selection Monitoring Tool
StackTrace:
at Selection_Monitoring_Tool.ViewModels.SettingsViewModel._importWorker_DoWork(Object sender, DoWorkEventArgs e) in c:\Users\Joost\Desktop\Selection Monitoring Tool\Selection Monitoring Tool\ViewModels\SettingsViewModel.cs:line 216
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException:
正如@HansPassant 所建议的,我不得不取消选中 "Break when this exception type is user unhandeled" 复选框。
我有一个后台工作人员:
private readonly BackgroundWorker _importWorker = new BackgroundWorker() { WorkerReportsProgress = true };
在我的构造函数中我这样做:
_importWorker.DoWork += _importWorker_DoWork;
_importWorker.ProgressChanged += _importWorker_ProgressChanged;
_importWorker.RunWorkerCompleted += _importWorker_RunWorkerCompleted;
以下是代表们:
private void _importWorker_DoWork(object sender, DoWorkEventArgs e)
{
var args = (object[]) e.Argument;
var walletColumnName = (string) args[0];
var fundColumnName = (string) args[1];
var isinColumName = (string) args[2];
var marketValueDirtyColumnName = (string) args[3];
var seperator = (string) args[4];
var importFilePath = (string) args[5];
var importFile = Path.GetFileName(importFilePath);
var onePercent = 100.0 / File.ReadLines(importFilePath).Count();
var totalPercentage = 0.0;
var parser = new TextFieldParser(importFilePath);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(seperator);
//Read colum indexes on the first line
var fields = parser.ReadFields();
var walletColumnIndex = Array.IndexOf(fields, walletColumnName);
var fundColomnIndex = Array.IndexOf(fields, fundColumnName);
var isinColumnIndex = Array.IndexOf(fields, isinColumName);
var marketValueDirtyColumnIndex = Array.IndexOf(fields, marketValueDirtyColumnName);
if (walletColumnIndex == -1 || fundColomnIndex == -1 || isinColumnIndex == -1 ||
marketValueDirtyColumnIndex == -1)
{
throw new ArgumentException("Eén of meerdere kolommen niet gevonden in " + importFile);
}
//TODO
e.Result = importFile;
}
private void _importWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Progress = e.ProgressPercentage;
}
private void _importWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
Messenger.Default.Send(e.Error);
}
else if (e.Result != null)
{
PenultimateImportFileName = LastImportFileName;
PenultimateImportDate = LastImportDate;
LastImportFileName = e.Result.ToString();
LastImportDate = ImportDate;
_dataContainer.UpdateImportSettings(_importSettings);
}
Progress = 100;
IsBusy = false;
}
抛出异常时,backroundworker 不会调用e.Error,而是应用程序崩溃。这是否正常,如何解决?我读到 E.Error 在 dowork 中抛出未处理的异常时自动调用。
我是这样称呼后台工作人员的:
_importWorker.RunWorkerAsync(new object[] {WalletColumnName, FundColumnName, IsinColumName, MarketValueDirtyColumnName, Seperator, s});
编辑
调试器确实中断并抛出了我在代码中抛出的异常:
System.ArgumentException was unhandled by user code
HResult=-2147024809
Message=Eén of meerdere kolommen niet gevonden in 021214-0.txt
Source=Selection Monitoring Tool
StackTrace:
at Selection_Monitoring_Tool.ViewModels.SettingsViewModel._importWorker_DoWork(Object sender, DoWorkEventArgs e) in c:\Users\Joost\Desktop\Selection Monitoring Tool\Selection Monitoring Tool\ViewModels\SettingsViewModel.cs:line 216
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException:
正如@HansPassant 所建议的,我不得不取消选中 "Break when this exception type is user unhandeled" 复选框。