2014-11-08 112 views
1

我已經建立了SignalR樞紐,其具有以下方法:SignalR長時間運行進程

public void SomeFunction(int SomeID) 
    { 

     try 
     { 

      Thread.Sleep(600000); 

      Clients.Caller.sendComplete("Complete"); 

     } 
     catch (Exception ex) 
     { 
      // Exception Handling 
     } 
     finally 
     { 
      // Some Actions 
     } 

     m_Logger.Trace("*****Trying To Exit*****"); 
    } 

我遇到的問題是SignalR啓動並默認爲服務器發送事件,然後掛起。即使函數/方法稍後退出(10分鐘),即使先前在客戶機上啓動/調用sendComplete和hub.stop()方法時,該方法也會再次啓動(> 3分鐘)。用戶應該在頁面上保留最初的「/ send?」請求保持無限期開放。任何援助非常感謝。

回答

4

爲避免阻塞該方法很長時間,可以使用Task並異步調用客戶端方法。當請求到達

public void SomeFunction(Int32 id) 
{ 
    var connectionId = this.Context.ConnectionId; 
    Task.Delay(600000).ContinueWith(t => 
    { 
    var message = String.Format("The operation has completed. The ID was: {0}.", id); 
    var context = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); 
    context.Clients.Client(connectionId).SendComplete(message); 
    }); 
} 

集線器的創建和發送響應沿着電線後遭到破壞,因此在後續任務,你需要創建一個新的上下文爲自己能夠通過他們的連接標識符與客戶合作,因爲原來的集線器實例將不再爲您提供Clients方法。

另請注意,您可以利用更好的語法使用asyncawait關鍵字來描述異步程序流。請參閱The ASP.NET Site's SignalR Hubs API Guide的示例。