即使出现异常,也会将Access参数传递给BackgroundWorker
本文关键字:Access 参数传递 BackgroundWorker 异常 | 更新日期: 2023-09-27 18:08:38
短版本
如果出现异常,如何访问在RunWorkerCompleted
事件中传递给BackgroundWorker
的参数?
更长版本
我在应用程序中使用BackgroundWorker
组件。在应用程序启动时,我查询数据库以获得未发送的消息列表。然后使用GSM调制解调器(内部后台工作人员(,我一个接一个地发送消息。
现在,一旦我决定发送消息,我就会将其添加到名为CurrentlyHandledMessages的列表中。这是为了确保两个调制解调器不会发送相同的消息。
现在,我将消息的ID作为参数传递给BackgroundWorker
,它会发送消息,并且会引发RunWorkerCompleted
事件,并从CurrentlyHandledMessages列表中删除该ID。我把结果作为元组传递。
e.Result = new Tuple<int, String>(idToHandle, response);
如果没有例外的话,这一切都很好。
但是,如果出现异常,我看不出如何将参数传递给BackgroundWorker
。因为在RunWorkerCompleted
事件中,无论怎样,我都希望删除id。
没有内置的方法来获取传递的参数(在本例中为ID(。你需要自己传递。我建议您一直简单地传递它,不管发生什么异常,所以想象一下DoWork
处理程序内部的情况:
string response;
try
{
...
response = "something";
}
catch (Exception ex)
{
response = e.ToString();
}
finally
{
e.Result = new Tuple<int, string>((int)e.Argument, response);
}
所以现在,不管结果如何,您都要将该ID放入RunWorkerCompleted
处理程序中。
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
try
{
// do the work
}
catch (Exception ex) // on error
{
e.Error = ex;
e.Result = "set the data here";
}
}
完整事件
检查e。首先是错误,然后是取消,最后是结果
您可以通过RunWorkerCompletedEventArgs的Error属性传递信息。
您需要使用Id
和Response
处理异常并抛出自定义异常
根据MSDN
RunWorkerCompleted事件处理程序应始终检查AsyncCompletedEventArgs.Error和AsyncCompleted EventArgs.Cancelled属性,然后再访问RunWorkerCompletedEventArgs.Result所有物如果引发异常或者如果操作被取消,访问RunWorkerCompletedEventArgs.Result属性会引发例外
只需从BackgroundWorker派生并实现所需的属性:
public class CustomBackgroundWorker : BackgroundWorker
{
public object Argument { get; private set; }
protected override void OnDoWork(DoWorkEventArgs e)
{
Argument = e.Argument;
base.OnDoWork(e);
}
}
然后从RunWorkerCopmleted和其他事件访问它,如下所示:
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
object originalArgument = ((CustomBackgroundWorker)sender).Argument;
// The rest of the stuff
if (e.Cancelled) { ... }
if (e.Error) {...}
...
}
错误处理语义保持不变