2016-09-15 176 views
0

在我的SignalR2集線器中,我添加了一個將從客戶端調用的異步方法StartMyTask()以及OnConnected()方法。然而,每當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. 我假設如果我不想等到數據庫寫入,我會刪除Wait() - 是否正確?如果連接發生並且DB之後寫入,這會導致任何問題嗎?

回答

0

如果當前SynchronizationContext一次只允許一個線程(例如,ASP.NET同步上下文),則會發生這種情況。我在博客上詳細解釋了deadlock semantics

SignalR不應該泄漏SynchronizationContext.Current - 我的印象是他們固定這個,但顯然不是。

無論如何,你可以不堵異步工作解決您的代碼:

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

等待是不行的,因爲我調用這個從OnConnected(不異步方法)。 StartMyTask() - 沒有等待()關鍵字的作品,但你預先在OnConnected退出後將任何問題保存到數據庫嗎? - 我的意思是這個工作...所以如果我已經連接,我的信息稍後保存 – BobSwanson

+0

也是,StartMyTask()與TaskT = StartMyTask()相同? – BobSwanson

+0

@BobSwanson:就像我在回答中所做的那樣,使它成爲'async',然後'await'就可以工作。 –