短版
如果引发异常,如何访问传递给BackgroundWorker
事件中RunWorkerCompleted
的参数?
更长的版本
我在我的应用程序中使用BackgroundWorker
组件。在应用程序启动时,我查询数据库以获取未发送的消息列表。然后使用GSM调制解调器(内部后台工作人员)我逐个发送消息。
现在,当我决定发送消息时,我会将其添加到名为 CurrentlyHandledMessages 的列表中。这可以确保2个调制解调器不会发送相同的消息。
现在我将消息的ID作为参数传递给BackgroundWorker
并发送消息,然后引发RunWorkerCompleted
事件并从 CurrentlyHandledMessages中删除ID 列表。我将结果作为元组传递。
e.Result = new Tuple<int, String>(idToHandle, response);
如果没有例外,这是正常的。
但是,如果引发异常,我无法看到如何将参数传递给BackgroundWorker
。因为在RunWorkerCompleted
事件中,无论如何我都想删除id。
答案 0 :(得分:2)
没有内置的方法来获取传递的参数(在本例中为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
处理程序。
答案 1 :(得分:1)
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.Error,然后检查e.Cancelled,最后检查e.Result
答案 2 :(得分:1)
您可以通过Error的RunWorkerCompletedEventArgs属性传递信息。
您需要处理异常并使用Id
和Response
答案 3 :(得分:0)
根据MSDN
您的RunWorkerCompleted事件处理程序应始终检查 AsyncCompletedEventArgs.Error和AsyncCompletedEventArgs.Cancelled 访问RunWorkerCompletedEventArgs.Result之前的属性 属性。如果引发异常或操作被取消, 访问RunWorkerCompletedEventArgs.Result属性会引发一个 异常。
答案 4 :(得分:0)
只需从BackgroundWorker派生并实现必需的属性:
def foo(**kwargs):
if kwargs.get("isawesome"):
print("Dang you're awesome")
>>> some_magic(foo)
isawesome
然后从RunWorkerCopmleted和其他事件访问它,如下所示:
public class CustomBackgroundWorker : BackgroundWorker
{
public object Argument { get; private set; }
protected override void OnDoWork(DoWorkEventArgs e)
{
Argument = e.Argument;
base.OnDoWork(e);
}
}
错误处理语义保持不变