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 + " ]");
}
}
答案 0 :(得分:27)
来自MSDN:
如果操作完成 成功,其结果是 在DoWork事件处理程序中分配, 你可以通过访问结果 RunWorkerCompletedEventArgs.Result 属性。
and:
您的RunWorkerCompleted事件处理程序 应该经常检查错误和 访问前取消的属性 Result属性。如果是例外 被提出或如果手术是 取消,访问结果 财产引起了例外。
因此,如果没有成功完成(即你取消它),它看起来不会起作用。也许考虑将您的取消细节作为结果(成功)返回给您的中止案例,检测完成处理程序的差异?
答案 1 :(得分:19)
Result
属性用于表示已完成操作的结果。您已将Cancel
设置为true,表示操作已取消,因此不应该有结果。
听起来你应该在你的结果中编码“我因为出错而被中止”,或者抛出一个异常,将其设置为结果中的Error
属性 - Cancel
表示如果工作人员发现呼叫被外部取消,则设置。
RunWorkerCompletedEventArgs.Result
州的文档:
您的RunWorkerCompleted事件处理程序 应该经常检查错误和 访问前取消的属性 Result属性。如果是例外 被提出或如果手术是 取消,访问结果 财产引起了例外。
文档的“异常”部分还指出,如果Cancelled
为真,它将抛出异常。
答案 2 :(得分:2)
这很可能是因为代码取消了工作而不是完成工作。因此,尝试访问if(!e.Cancel)分支中的结果。