创建一个新线程并仅向调用Controller的用户发送消息

时间:2015-05-28 13:53:05

标签: asp.net-mvc signalr

当客户端调用Controller时,会创建一个新的Thread,这需要很长时间。视图被令人生畏地返回给用户。用户应该随时了解工作进度,因此使用SignalR。 如何只向调用Controller的用户发送更新。

如果我创建一个新的线程,HTTP上下文就会丢失,所以我不知道如何判断SignalR应该向哪个客户端发送信息。

2 个答案:

答案 0 :(得分:2)

当你产生你的线程时,你应该传递给它一个用户标识符,然后从线程获取一个hub上下文并调用类似的东西:

var context = GlobalHost.ConnectionManager.GetHubContext<YourHub>();
context.Clients.User(userId).whatever();

就可以了。默认情况下,用户ID将匹配在调用线程之前从主体获得的用户名(因此您的HTTP上下文仍然有效),但您也可以检查IUserIdProvider接口以查找备用处理它的方法。

答案 1 :(得分:1)

如果长时间运行操作的性质允许它(即您不需要呈现任何特定于MVC的视图或某些内容),您可以在hub方法(always use Task<T> and await to do that)中实现“长时间运行的工作”并将进度报告给客户shown here。示例代码缺少客户端部分。为此,请查看this SO question

这种方法有另一个好处。如果执行长时间运行操作的controller \ action 使用ASP.NET Session (这是默认行为),在长时间运行的请求完成之前,没有其他MVC操作\请求可以在服务器上运行因为会话锁定 - 请查看here以获取更多详细信息。另一边的SignalR 默认情况下不使用会话,因此可以减少一个问题......

哦,顺便说一句:不要创建自己的线程 - 效率非常低。使用ThreadPool.QueueUserWorkItem或更好的Task<T> API ...