即使出现异常,也会将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。

即使出现异常,也会将Access参数传递给BackgroundWorker

没有内置的方法来获取传递的参数(在本例中为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属性传递信息。

您需要使用IdResponse 处理异常并抛出自定义异常

根据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) {...}
    ...
}

错误处理语义保持不变