我已经设置了一个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分钟)。如果用户留在页面上的初始" /发送?"请求无限期保持开放。非常感谢任何帮助。
答案 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
方法。
另请注意,您可以利用使用async
和await
关键字的更好的语法来描述异步程序流。请参阅The ASP.NET Site's SignalR Hubs API Guide上的示例。