我有一个使用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()
答案 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的功能。