asp.net - 在ASP.NET中正确实现后台进程Thread

标签 asp.net asp.net-mvc multithreading

我需要执行一个无限循环,并希望在 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

最佳答案

ASP.NET 并不是为处理这种需求而设计的。如果您需要持续运行某些东西,最好创建一个 Windows 服务。

更新

ASP.NET 不是为长时间运行的任务而设计的。它旨在快速响应 HTTP 请求。参见 Cyborgx37's answerCan I use threads to carry out long-running jobs on IIS?有几个原因。

更新

现在您终于提到您正在使用 SignalR,我看到您正在尝试在 ASP.NET 中托管 SignalR,对吗?我认为你正在以错误的方式解决这个问题,请参阅示例 NuGet packageproject wiki 上引用.此示例使用 IAsyncHttpHandler管理任务。

关于asp.net - 在ASP.NET中正确实现后台进程Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25361421/

相关文章:

c# - 错误记录方法中使用的变量名和值

c# - EntityType 没有在 MVC 4 中定义的键

java - 有没有办法知道用户是否使用 readline() 方法按下了 ENTER 键? - java

c - 指向共享变量的指针互斥

c# - 循环遍历字典集合以搜索键并增加值

c# - RadComboBox.SelectedItem 不能分配给 -- 它是只读的

javascript - 单击 <a href ="#"/> 时,IE 总是重新加载整个页面

javascript - 将数组发送到 Controller

asp.net-mvc - 生成 <DbContext> 时出错

c++ - 如何有效地将偶尔遇到的参数传递给子线程?