【发布时间】:2014-10-11 06:07:35
【问题描述】:
我需要执行一个无限 while 循环,并希望在 global.asax 中启动执行。
我的问题是我应该怎么做?我应该开始一个新线程还是应该使用 Async 和 Task 或其他任何东西?在while循环中我需要做await TaskEx.Delay(5000);
如何做到这一点,它不会阻塞任何其他进程,也不会造成内存泄漏?
我用的是 VS10,AsyncCTP3,MVC4
编辑:
public void SignalRConnectionRecovery()
{
while (true)
{
Clients.SetConnectionTimeStamp(DateTime.UtcNow.ToString());
await TaskEx.Delay(5000);
}
}
只要应用程序可用,我需要做的就是在全局范围内将其作为单例实例运行。
编辑:已解决
这是 Global.asax 中的最终解决方案
protected void Application_Start()
{
Thread signalRConnectionRecovery = new Thread(SignalRConnectionRecovery);
signalRConnectionRecovery.IsBackground = true;
signalRConnectionRecovery.Start();
Application["SignalRConnectionRecovery"] = signalRConnectionRecovery;
}
protected void Application_End()
{
try
{
Thread signalRConnectionRecovery = (Thread)Application["SignalRConnectionRecovery"];
if (signalRConnectionRecovery != null && signalRConnectionRecovery.IsAlive)
{
signalRConnectionRecovery.Abort();
}
}
catch
{
///
}
}
我发现这篇关于如何使用异步工作者的好文章:http://www.dotnetfunda.com/articles/article613-background-processes-in-asp-net-web-applications.aspx
还有这个: http://code.msdn.microsoft.com/CSASPNETBackgroundWorker-dda8d7b6
但我认为根据我的需要,这将是完美的: http://forums.asp.net/t/1433665.aspx/1
【问题讨论】:
-
Clients.SetConnectionTimeStamp 有什么作用?它的目的是什么?您希望实现哪些特定功能?如果您想要一个高质量的答案,您需要提供此信息。
-
这个最好用定时器。
-
@cadrell0 我想从集线器外部通过集线器进行广播github.com/SignalR/SignalR/wiki/Hubs
-
如果您能够回答自己的问题,请将其发布为答案并将其标记为已接受。
标签: asp.net asp.net-mvc multithreading