当前位置: 首页 > 编程语言 > C#

C#后台worker在DoWork中设置e.Result并在WorkCompleted中获取值分享

时间:2023-04-10 18:59:26 C#

C#后台worker在DoWork中设置e.Result并在WorkCompleted中获取值C#2008SP1IamUsingabackgroundworkerif其中一个条件失败,我将e.cancel设置为true并将字符串分配给e.result。那里一切正常。但是,当workCompleted触发时,我测试了e.Result并得到了一个异常“e.result引发了SystemInvalidOperation类型的异常”。我想我可以使用全局变量在DoWork中设置并比较完成的工作。但这可能不是线程安全的。谁能告诉我为什么我用e.Result得到这个,我该如何解决这个问题?非常感谢,privatevoidbgwPrepareCall_DoWork(objectsender,DoWorkEventArgse){//查看被叫号码是否被屏蔽。//如果数字被阻止显示错误消息。if(this.IsNoGateway(sipUsername,statusDisplay1.PhoneNumber)){//this.SetIdleState(DialerErrorMessage.GetErrorDescription(12));e.Cancel=true;e.Result="NoGateway";返回;}if(!this.IsInvalidTelephoneNumber(sipUsername,statusDisplay1.PhoneNumber)){//this.SetIdleState(DialerErrorMessage.GetErrorDescription(13));e.Cancel=true;e.Result="InvalidNumber";返回;}}privatevoidbgwPrepareCall_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){if(e.Error==null){if(e.Cancelled){//切换失败(e.Result.ToString()){case"NoGateway":Console.WriteLine("NoGateway:[失败]");休息;case"InvalidNumber":Console.WriteLine("InvalidNumber:[Failed]");休息;默认值:Console.WriteLine("Unknown");break;}}if(!e.Cancelled){//成功Console.WriteLine("NoGateway:[ok]");Console.WriteLine("InvalidNumber:[ok]");}}else{Console.WriteLine("PrepareCallFailed:["+e.Error.Message+"]");}}来自MSDN:如果操作成功完成并且其结果在DoWork事件处理程序中分派,则可以通过RunWorkerCompletedEventArgs访问结果.Result属性并且:RunWorkerCompleted事件处理程序在访问Result属性之前应始终检查Error和Canceled属性。如果引发异常或操作被取消,访问Result属性将引发异常。因此,如果它没有成功完成(即你取消了它),它看起来不像它会工作。也许考虑将你的取消详细信息作为结果(成功)返回到你的中止案例,检测完成处理程序中的差异?Result属性用于表示结果已完成的操作。您已将CancelSet设置为true以指示操作已取消,因此应该没有结果。听起来你应该在你的结果中编码“我因为错误而中止”,或者抛出一个异常,这将被设置为结果中的Error属性——如果工作人员发现调用被外部取消。RunWorkerCompletedEventArgs.Result状态的文档:RunWorkerCompleted事件处理程序应始终在访问Result属性之前检查Error和Canceled属性。如果抛出异常或操作被取消,访问Result属性将抛出异常。文档的“异常”部分还指出,如果Cancelled为真,它将抛出异常。这很可能是因为代码取消了工作而不是完成了工作。所以尝试在if(!e.Cancel)分支访问结果。以上是C#学习教程:C#后台worker在DoWork中设置e.Result,在WorkCompleted中获取共享值的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: