SignalR长时间运行过程

时间:2014-11-08 06:06:46

标签: asp.net asp.net-mvc signalr signalr-hub signalr.client

我已经设置了一个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启动并默认为Server Sent Events然后挂起。即使函数/方法在几分钟后退出(10分钟),即使在客户端之前启动/调用sendComplete和hub.stop()方法,该方法也会再次启动(> 3分钟)。如果用户留在页面上的初始" /发送?"请求无限期保持开放。非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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上的示例。