2014-11-08 3 views
1

У меня есть настроить SignalR концентратор, который имеет следующий метод:SignalR Long Запуск процесса

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 инициирует и по умолчанию сервера Sent Events, а затем зависает. Несмотря на то, что функция/метод выходит через несколько минут (10 минут), метод запускается снова (> 3 минуты), даже когда методы sendComplete и hub.stop() инициируются/вызывают на клиенте ранее. Должен ли пользователь оставаться на странице первоначальным «/ отправить?»? запрос остается открытым на неопределенный срок. Любая помощь очень ценится.

ответ

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.

Также обратите внимание, что вы можете использовать более удобный синтаксис, который использует async и await ключевые слова для описания асинхронного потока программы. См. Примеры по адресу The ASP.NET Site's SignalR Hubs API Guide.

Смежные вопросы