2014-02-10 3 views
0

C# SignalR 클라이언트가 있고 서버 연결 성공/실패시 일부 작업을 수행하고 싶습니다. 여기 내 코드입니다 :SignalR Start()의 작업이 연결이 불가능한 경우에도 계속됩니다.

this.connection.Start().ContinueWith(task => 
{ 
     if (task.IsFaulted) 
     { 
      this.OnRaiseServerConnectionClosedEvent(); 
     } 
     else 
     { 
      this.JoinGroup(); 
      this.StopTimer(); 
      this.OnRaiseServerConnectionOpenedEvent(); 
     } 
    }); 
} 

이 다른 블록은 서버가 여기인지 아닌지 항상 ... 쓰지 않는, 실행

나는 또한 await를하거나 대기()하지만 같은 시나리오를 시도했다.

나는 .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

실행중인 SignalR 서버 및 .Net 클라이언트의 버전은 무엇입니까? – halter73

+0

죄송합니다. 언급해야합니다. 서버와 클라이언트는 v2.0에 있습니다. –

답변

0

Connection.Start에서받는 작업은 오류가 발생하지 않고 시간 초과로 인해 취소되었을 수 있습니다. 이것은 쉽게 수정해야한다 :

this.connection.Start().ContinueWith(task => 
{ 
    if (task.IsFaulted || task.IsCanceled) 
    { 
     this.OnRaiseServerConnectionClosedEvent(); 
    } 
    else 
    { 
     this.JoinGroup(); 
     this.StopTimer(); 
     this.OnRaiseServerConnectionOpenedEvent(); 
    } 
}); 

당신이 기다립니다 (사용하는 경우) 작업이 취소 될 때 대신 ContinueWith의 그 InnerExceptions 수집에 사용하여 OperationCanceledException을 포함하는 AggregateException가 발생합니다.

+0

"task.IsCanceled"를 추가해도 문제가 해결되지 않으며 서버가 다운 된 경우에도 else 블록이 실행됩니다. Wait()를 사용하면 AggregateException이 발생하지만 JoinGroup() 메서드의 Invoke 때문에 InvalidOperationException이 발생합니다. –

관련 문제