经过深入研究Silverlight中的异常处理并阅读一些有用的博客 Silverlight exception handling using WCF RIA Services and WCF Services 我最终在App.xaml.cs中实现了类似的想法,以显示错误页面并调用另一个wcf服务方法将错误记录到事件查看器:
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (!System.Diagnostics.Debugger.IsAttached)
{
var errorPage = new Error();
errorPage.Show();
string errorMsg = string.Format("{0} {1}", e.ExceptionObject.Message, e.ExceptionObject.StackTrace);
EventHandler<WriteIntoEventLogCompletedEventArgs> callback = (s, ev) =>
{
bool result = ev.Result;
};
(new ServiceProxy<ApplicationServiceClient>()).CallService<WriteIntoEventLogCompletedEventArgs>(callback, errorMsg);
e.Handled = true;
}
}
这就是我在Error.xaml.cs中所拥有的:
private void OKButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
当用户点击OK时,基本上会关闭错误页面。
大多数情况下一切正常。当wcf服务的一个回调导致异常时,会出现问题。错误页面将很好地显示,当用户单击确定时,错误页面将关闭。但是后台仍然显示忙指示符,原始服务回调仍在等待响应。我需要以某种方式终止它。
如果有人能提供帮助,我会很高兴。
谢谢, 实
-
非常感谢您的回复。我使用了相同的想法,并在原始服务回调方法中添加了一个代码来检查e.Error,如果它不是null,则关闭窗口(它是一个子窗口) busyindicator,现在一切都很完美。再次感谢。实
答案 0 :(得分:0)
我的猜测是原始服务回调可能正在完成但处于错误状态。您可能需要检测错误情况并将busyindicator的IsBusy属性设置为False。
要检查的事情
原始服务回调是否至少成功返回?您可以通过在原始服务回调方法中放置断点来检查这一点。
您是否正确处理了回调方法中的错误情况。例如 -
void proxy_GetUserCompleted(object sender, GetUserCompletedEventArgs e)
{
if (e.Error != null)
{
getUserResult.Text = "Error getting the user.";
}
else
{
getUserResult.Text = "User name: " + e.Result.Name + ", age: " + e.Result.Age + ", is member: " + e.Result.IsMember;
}
}
参考 - http://msdn.microsoft.com/en-us/library/cc197937(v=VS.95).aspx