即使无法连接,SignalR Start()的任务仍在继续

时间:2014-02-10 18:06:30

标签: signalr

我有一个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()方法创建的任务将返回无故障且状态为连接。如果要执行某些操作或重试连接,则必须检查连接状态。

1 个答案:

答案 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。