我正在执行一系列 Caliburn.Micro IResults,方法是从 Caliburn.Micro 操作消息调用的 IEnumerable 方法中返回它们。第一个 IResult 调用 WCF RIA 服务调用操作。有时此操作会失败并引发异常。这是在检查 InvokeOperation 对象的错误的 IResult 中处理的,我将错误标记为已处理并将 IResult 的错误消息字段设置为错误,以便我可以从客户端恢复它。
问题是由于某种原因这会中断协同程序的执行。我想不出任何好的理由,但是当我处于调试模式时,VS 会跳到服务器代码并调出未处理的异常帮助程序,告诉我有一个未捕获的异常(duh),并且协程永远不会继续执行 IEnumerable 的其他成员。
这是一些代码。
从操作消息调用:
public IEnumerable<IResult> Submit()
{
var register = new RegisterUserResult(Username, Password, Email, _userModel);
yield return register;
if (register.Success)
{
if (RegisterAsTrainer)
yield return new ApplyRoleToUserResult(Username, "Trainer", _userModel);
yield return new NavigateResult(new Uri("/MainPageViewModel", UriKind.Relative));
}
else ErrorMessage = register.ErrorMessage;
}
DomainService 中的代码(有时会引发异常)
[Invoke]
public void CreateUser(string username, string password, string email)
{
Membership.CreateUser(username, password, email);
}
...其中 Membership 是 ASP.NET 类,我用于成员管理。
调用上述服务的 IResult(为清楚起见省略了一些细节):
public void Execute(ActionExecutionContext context)
{
ErrorMessage = null;
Success = false;
var ctx = new TrainingContext();
ctx.CreateUser(_username, _password, _email, CreateUserCallback, null);
}
private void CreateUserCallback(InvokeOperation invokeOp)
{
if (invokeOp.HasError)
invokeOp.MarkErrorAsHandled();
Completed(this, new ResultCompletionEventArgs
{
Error = invokeOp.Error,WasCancelled = invokeOp.IsCanceled
});
}
IResult.Completed确实会触发,但该方法的其余部分永远不会执行。我真的把我的头发扯掉了,请帮助我。