2

精简版

如果引发异常,我如何访问传递给事件的参数BackgroundWorkerRunWorkerCompleted

更长的版本

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

现在,只要我决定发送一条消息,我就会将它添加到一个名为CurrentHandledMessages的列表中。这是为了确保 2 个调制解调器不会发送相同的消息。

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

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

如果没有例外,这工作正常。

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

4

5 回答 5

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处理程序中。

于 2013-04-11T02:54:01.663 回答
1

您可以通过RunWorkerCompletedEventArgs的Error属性传递信息。

您需要使用 and 处理异常并抛出自定义Id异常Response

于 2013-04-11T03:11:24.103 回答
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

于 2013-04-11T03:04:42.837 回答
0

根据MSDN

在访问 RunWorkerCompletedEventArgs.Result 属性之前,您的 RunWorkerCompleted 事件处理程序应始终检查 AsyncCompletedEventArgs.Error 和 AsyncCompletedEventArgs.Cancelled 属性。如果引发异常或取消操作,则访问 RunWorkerCompletedEventArgs.Result 属性会引发异常。

于 2015-06-16T04:18:10.873 回答
0

只需从 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) {...}
    ...
}

错误处理语义保持不变

于 2016-04-22T20:12:43.160 回答