处理SignalR中的协商异常

时间:2012-09-10 13:57:14

标签: c# silverlight-4.0 signalr

我有一个使用SignalR访问服务器的Silverlight 5应用程序。大多数情况下这会产生罚款,但是在调试中运行时我会在协商期间收到错误。我认为这可能是因为我的本地ISS安装耗尽了连接。

无论如何,当发生这种情况时,我的应用程序中的Unhandled Exception处理程序被调用。我想改变它,以便我可以处理SignalR初始化的本地异常。我不希望协商错误传播到我的中央错误处理程序。

我有一段代码如下:

     var uri = Application.Current.Host.Source.GetComponents(UriComponents.Scheme | UriComponents.HostAndPort, UriFormat.Unescaped);

     _hubConnection = new HubConnection(uri);
     var hub = _hubConnection.CreateProxy("stuffhub");
     hub.On<Stuff>("Stuff", message => DoStuff());

     var transport = new LongPollingTransport();
     _hubConnection.Start(transport);

此代码在大多数情况下执行正常,但有时在上面的代码执行几秒后,以下异常将传递给我的中央未处理的excpetion处理程序。

Message: Exception(s) occurred : .
[ Exception(s) occurred : .
[ Exception(s) occurred : .
[ Exception(s) occurred : .
[ System.InvalidOperationException: Server negotiation failed.
   vid SignalR.Client.Transports.HttpBasedTransport.<GetNegotiationResponse>b__0(IResponse     response)
   vid SignalR.TaskAsyncHelper.FromMethod[T1,TResult](Func`2 func, T1 arg) ]
 ]
 ]

ApplicationUnhandledExceptionEventArgs的StackTrace是:

 at System.Threading.Tasks.Task.Finalize()

2 个答案:

答案 0 :(得分:1)

就像Jon Skeet所说,你需要处理Start()返回的任务中的异常。

var uri = Application.Current.Host.Source.GetComponents(UriComponents.Scheme | UriComponents.HostAndPort, UriFormat.Unescaped);

 _hubConnection = new HubConnection(uri);
 var hub = _hubConnection.CreateProxy("stuffhub");
 hub.On<Stuff>("Stuff", message => DoStuff());

 _hubConnection.Start().ContinueWith(task => 
 {
     if(task.IsFaulted) {
         Debug.WriteLine("Error starting -" + task.Exception.GetBaseException());
     }
 });

答案 1 :(得分:0)

我不清楚哪个任务正在抛出异常,但如果它是你控制的那个,你可以简单地添加一个延续:

task.ContinueWith(t => {
    // Depending on t.Status (cancelled or faulted) you could perform logging
    // or whatever... presumably nothing's watching for the task to complete,
    // otherwise *it* would see the exception...
}, TaskContinuationOptions.NotOnRanToCompletion);

当然,如果您可以使用.NET 4.5和C#5,async / await 可以帮助您 - 这取决于SignalR的功能。