即使存在异常,Access参数也会传递给BackgroundWorker?

时间:2013-04-11 02:42:04

标签: c# backgroundworker

短版

如果引发异常,如何访问传递给BackgroundWorker事件中RunWorkerCompleted的参数?

更长的版本

我在我的应用程序中使用BackgroundWorker组件。在应用程序启动时,我查询数据库以获取未发送的消息列表。然后使用GSM调制解调器(内部后台工作人员)我逐个发送消息。

现在,当我决定发送消息时,我会将其添加到名为 CurrentlyHandledMessages 的列表中。这可以确保2个调制解调器不会发送相同的消息。

现在我将消息的ID作为参数传递给BackgroundWorker并发送消息,然后引发RunWorkerCompleted事件并从 CurrentlyHandledMessages中删除ID 列表。我将结果作为元组传递。

e.Result = new Tuple<int, String>(idToHandle, response);

如果没有例外,这是正常的。

但是,如果引发异常,我无法看到如何将参数传递给BackgroundWorker。因为在RunWorkerCompleted事件中,无论如何我都想删除id。

5 个答案:

答案 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)

您可以通过ErrorRunWorkerCompletedEventArgs属性传递信息。

您需要处理异常并使用IdResponse

抛出自定义异常

答案 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);
    }
}

错误处理语义保持不变