我有一个C#SignalR客户端,我希望在连接到服务器成功/失败时执行一些操作。这是我的代码:
this.connection.Start().ContinueWith(task =>
{
if (task.IsFaulted)
{
this.OnRaiseServerConnectionClosedEvent();
}
else
{
this.JoinGroup();
this.StopTimer();
this.OnRaiseServerConnectionOpenedEvent();
}
});
}
总是执行else块,如果服务器在这里,则不关心...
我也试过await或者Wait()但同样的情况。
我正确理解.net任务我想但在这里我被卡住了。
非常感谢您的帮助:)
晏
编辑:
现在我的代码看起来像
try
{
this.connection.Start().Wait();
if (this.connection.State == ConnectionState.Connected)
{
this.JoinGroup();
this.StopTimer();
this.OnRaiseServerConnectionOpenedEvent();
}
}
catch (AggregateException)
{
this.OnRaiseServerConnectionClosedEvent();
}
catch (InvalidOperationException)
{
this.OnRaiseServerConnectionClosedEvent();
}
当没有服务器时,Start()方法创建的任务将返回无故障且状态为连接。如果要执行某些操作或重试连接,则必须检查连接状态。
答案 0 :(得分:0)
您从Connection.Start收到的任务很可能因超时而被取消,而不是出现故障。这应该是一个简单的解决方法:
this.connection.Start().ContinueWith(task =>
{
if (task.IsFaulted || task.IsCanceled)
{
this.OnRaiseServerConnectionClosedEvent();
}
else
{
this.JoinGroup();
this.StopTimer();
this.OnRaiseServerConnectionOpenedEvent();
}
});
如果使用Wait()而不是ContinueWith,则在取消任务时将抛出其InnerExceptions集合中包含OperationCanceledException的AggregateException。