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)分支中访问结果。