17

C# 2008 SP1

我正在使用后台工作人员

如果其中一个条件失败,我会将 e.cancel 设置为 true,并将字符串分配给 e.result。一切都在那里工作。

但是,当 workCompleted 触发时,我测试 e.Result 并得到一个异常“e.result 抛出 systeminvalidoperation 类型的异常”。

我想我可以使用全局变量在 DoWork 中设置并在完成的工作中进行比较。但这可能不是线程安全的。

谁能告诉我为什么我用 e.Result 得到这个,我该如何解决这个问题?

非常感谢,

    private void bgwPrepareCall_DoWork(object sender, DoWorkEventArgs e)
    {
        // Check to see if the called number is blocked. 
        // If the nubmer is blocked display error message.
        if (this.IsNoGateway(sipUsername, statusDisplay1.PhoneNumber))
        {
            // this.SetIdleState(DialerErrorMessage.GetErrorDescription(12));
            e.Cancel = true;
            e.Result = "NoGateway";
            return;
        }

        if (!this.IsInvalidTelephoneNumber(sipUsername, statusDisplay1.PhoneNumber))
        {
            // this.SetIdleState(DialerErrorMessage.GetErrorDescription(13));
            e.Cancel = true;
            e.Result = "InvalidNumber";
            return;
        }
    }

    private void bgwPrepareCall_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            if (e.Cancelled)
            {
                // Failed
                switch (e.Result.ToString())
                {
                    case "NoGateway":
                        Console.WriteLine("NoGateway: [ Failed ]");
                        break;

                    case "InvalidNumber":
                        Console.WriteLine("InvalidNumber: [ Failed ]");
                        break;

                    default:
                        Console.WriteLine("Unknown");
                        break;
                }
            }
            if (!e.Cancelled)
            {
                // Successfull
                Console.WriteLine("NoGateway: [ ok ]");    
                Console.WriteLine("InvalidNumber: [ ok ]");
            }
        }
        else
        {
            Console.WriteLine("PrepareCall Failed: [ " + e.Error.Message + " ]");
        }
    }
4

3 回答 3

27

来自MSDN

如果操作成功完成并在 DoWork 事件处理程序中分配其结果,则可以通过 RunWorkerCompletedEventArgs.Result 属性访问结果。

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

因此,如果它没有成功完成(即您取消它),它看起来将无法正常工作。也许考虑返回您的取消详细信息作为您的中止案例的结果(作为成功),以检测完成处理程序中的差异?

于 2009-05-13T06:13:51.207 回答
19

Result属性旨在表示已完成操作的结果。您已设置Cancel为 true,这意味着操作已取消,因此不应该有结果。

听起来您应该将“我因出现问题而中止”编码到您的结果中,或者抛出一个异常,该异常将被设置为Error结果中的属性 -Cancel如果工作人员注意到调用被外部取消,则应设置该异常.

状态的文档RunWorkerCompletedEventArgs.Result

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

Cancelled文档的“异常”部分还指出,如果为真,它将引发异常。

于 2009-05-13T06:11:00.197 回答
2

这很可能是因为代码取消了工作而不是完成它。所以尝试访问 if(!e.Cancel) 分支中的结果。

于 2009-05-13T06:21:06.513 回答