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

C#2008 SP1

我正在使用后台工作者

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

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

我想我可以使用全局变量在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 + " ]"); } } 

来自MSDN :

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

并且 :

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

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

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

听起来你应该在你的结果中编码“我因为出错而被中止”,或者抛出一个exception,它将被设置为结果中的Error属性 – 如果工作人员发现呼叫是从外部取消。

RunWorkerCompletedEventArgs.Result状态的文档:

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

文档的“exception”部分还指出,如果Cancelled为true,它将抛出exception。

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