【发布时间】:2016-12-07 02:13:32
【问题描述】:
我有一个非常奇怪的问题,前一天我开始开发一些产品同步的应用程序。产品列表的下载必须是异步的,才能在更新期间不锁定 GUI。我确实选择了一个后台工作人员来执行该任务,所有工作都按其应有的方式工作,以防出现错误,我已在 RunWorkerCompleted 中处理了它们。
最近我被要求做一些改进,但现在我确实遇到了一个大问题,来自后台工作人员之一的 DoWork 方法内部的异常是从这个方法中抛出的,而不是从 RunWorkerCompleted 。
也许一些 NET 框架更新改变了我不知道的 backgroundWorker 行为?我真的不跟踪框架版本,直到现在一切正常。如果它很重要,我会使用 SharpDevelop 5.1 作为 IDE。
我已经通过有关问题的几次网络搜索,但任何解决方案似乎都无法解决我的问题,或者我可能以错误的方式应用它?所以有些事情我已经尝试过
- 在非调试模式下运行应用程序 - 没有任何变化
- 在 DoWork 中捕获异常并取消后台工作程序 - 然后工作程序完成但没有错误传递给 RunWorkerCompleted
- 从 RunWorkerCompleted 内部摆脱 e.Result.ToString(),因为它必须破坏事物 - 对我来说,这在一开始就有效,没有任何问题,删除它或保持原样都没有区别
我不知道发生了什么变化,也不知道如何解决它,是否有人对如何解决我的问题并让 BackgroundWorker 以应有的方式传递错误有任何建议。
这是导致问题的代码
public string WEB_JSON_RAW_DATA {get;set;}
bgwProductListUpdater = new BackgroundWorker();
bgwProductListUpdater.WorkerReportsProgress = true;
bgwProductListUpdater.DoWork += new DoWorkEventHandler(this.bgwProductListUpdaterDoWork);
bgwProductListUpdater.ProgressChanged += new ProgressChangedEventHandler(this.bgwProductListUpdaterProgressChanged);
bgwProductListUpdater.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.bgwProductListUpdaterRunWorkerCompleted);
void bgwProductListUpdaterDoWork(
object sender,
System.ComponentModel.DoWorkEventArgs e)
{
//source of exception
WEB_JSON_RAW_DATA += (string)ApiClient.Get("/admin/product.json?GET_LIST");
//rest of json processing
}
void bgwProductListUpdaterProgressChanged(
object sender,
System.ComponentModel.ProgressChangedEventArgs e)
{
//this method is empty, it was intended to be used but then no need of progress repporting was needed
//it was all the time in my code so i do paste it as well
}
void bgwProductListUpdaterRunWorkerCompleted(
object sender,
System.ComponentModel.RunWorkerCompletedEventArgs e)
{
if(e.Error != null)
{
string ExtraErrorData = "";
if (e.Error.Data.Count > 0)
{
foreach (DictionaryEntry de in e.Error.Data)
ExtraErrorData += string.Format(
" Key: {0,-20} Value: {1}",
"'" + de.Key.ToString() + "'",
de.Value) + Environment.NewLine;
}
Common.LogWindow.Log(string.Format("{0} - Downloading product list - {1}",ShortName,
Environment.NewLine + e.Error.Message +
Environment.NewLine + ExtraErrorData +
Environment.NewLine + e.Result.ToString()));
ShopHasErrors = true;
}
//do rest of finalizing
}
【问题讨论】:
标签: c# .net exception backgroundworker