C#后台工作者在DoWork中设置e.Result并在WorkCompleted中获取值

ant*_*009 17 c# backgroundworker

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 + " ]");
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 27

来自MSDN:

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

并且:

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

因此,如果它没有成功完成(即你取消它),它看起来不会起作用.或许考虑将您的取消细节作为结果(作为成功)返回给您的中止案例,检测完成处理程序的差异?


Jon*_*eet 19

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

这听起来像你应该编码"我放弃,因为出事了"进你的结果,或抛出将被设置为一个异常Error的结果,而不是财产- Cancel的意思应被设置为在工作人员注意到,呼叫外部取消.

国家文件RunWorkerCompletedEventArgs.Result:

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

文档的"异常"部分还指出如果Cancelled为真,它将抛出异常.