0

我有一个 Silverlight 5 应用程序使用 SignalR 访问服务器。大多数情况下,这可以正常工作,但有时在调试中运行时,我会在协商过程中遇到错误。我在想这可能是因为我的本地 ISS 安装用完了连接。

无论如何,当这种情况发生时,我的应用程序中的未处理异常处理程序会被调用。我想更改它,以便我可以处理 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);

这段代码大部分时间都执行得很好,但有时在上面的代码执行几秒钟后,以下异常会被交给我的中央未处理的异常处理程序。

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()
4

2 回答 2

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());
     }
 });
于 2012-09-14T03:57:38.700 回答
1

我不清楚究竟是哪个任务引发了异常,但如果它是你控制的,你可以简单地添加一个延续:

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 的功能。

于 2012-09-13T22:39:46.907 回答