2016-09-15 4 views
0

내 SignalR2 허브에 OnConnected() 메소드뿐만 아니라 클라이언트에서 호출되는 비동기 메소드 인 StartMyTask()를 추가했습니다. 그러나 때마다 OnConnected는 결코 실행되지 않습니다 허브에 연결 (또는 base.OnConnected() 반환) 결코 충돌하지됩니다 :SignalR 비동기 작업

public override Task OnConnected() 
    { 
     StartMyTask().Wait(); // add stuff to db here 
     return base.OnConnected(); 
    } 

    static async Task StartMyTask() 
    { 
     await Task.Run(() => 
     { 
      Thread.Sleep(10); 
     }); 
    } 
  1. 왜 내가 연결할 수 없습니다입니다 :

    허브를? StartMyTask를 작업이 아닌 것으로 만들면 작동합니다.

  2. 내가 DB 쓰기를 기다릴 필요가 없다면 Wait()을 제거하겠다고 가정합니다. - 맞습니까? 연결이 발생하여 DB가 쓴다면 문제가 발생합니까?

답변

0

이것은 한 번에 하나의 스레드 만 허용하는 현재 SynchronizationContext (예 : ASP.NET 동기화 컨텍스트)이있는 경우 발생할 수 있습니다. 나는 내 블로그에 deadlock semantics을 전부 설명한다.

SignalR은 누설하지 않아야합니다. SynchronizationContext.Current - 나는이 문제를 해결했다는 인상하에 있었지만 외관상으로는 아닙니다.

에 관계없이, 당신은 비동기 작업에 차단하지 않음으로써 코드를 수정할 수 있습니다 내가 OnConnected (안 비동기 방식)에서이 전화 드렸습니다로

public override async Task OnConnected() 
{ 
    await StartMyTask(); 
    await base.OnConnected(); 
} 
+0

가 작동하지 않습니다 기다리고 있습니다. StartMyTask() - Wait() 키워드없이 작동하지만 OnConnected가 종료 된 후 DB에 물건을 저장하는 데 문제가 있습니까? -이 방법은 작동합니다 ... 이미 연결되어 있고 정보가 나중에 저장되면 어떻게됩니까? – BobSwanson

+0

도 StartMyTask()와 같은 태스크 t = StartMyTask()입니까? – BobSwanson

+0

@BobSwanson : 답변에서와 같이 그냥 비동기로 설정하면 '대기'가 작동합니다. –