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

Reg*_*ser 15 asp.net asp.net-mvc multithreading

我需要执行一个无限的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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

我需要做的就是在应用程序可用时将其作为全局单例实例运行.

编辑:解决

这是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
    {
            ///
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现这篇关于如何使用异步工作者的好文章: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

jru*_*ell 15

ASP.NET不是为处理这种要求而设计的.如果你需要不断运行的东西,你最好创建一个Windows服务.

更新

ASP.NET不适用于长时间运行的任务.它旨在快速响应HTTP请求.请参阅Cyborgx37的答案我可以使用线程在IIS上执行长时间运行的作业吗?原因有几个.

更新

既然你最后提到你正在使用SignalR,我看到你试图在ASP.NET中托管SignalR,对吗?我认为你的方法是错误的,请参阅项目维基上引用的示例NuGet包.此示例使用a 来管理任务.IAsyncHttpHandler

  • 我根本没有争论,只是陈述我的意见:).我不认为这必然是并行比较,因为在表单和服务中,用户操作正在关闭应用程序,而IIS应用程序池可以由于用户控制之外的多种原因(生命周期,请求数,内存使用等)进行回收. ). (3认同)
  • 第一个链接没有提供任何理由,第二个链接仅表明服务器可能选择在某个时刻回收应用程序池的非常明显的问题.我还没有听到有效的担心,为什么这是一个"坏主意".要将某些内容分解为Windows服务,使您的应用程序更难以部署,听起来对我来说是个坏主意.有人有真正的理由还是仅仅是意识形态? (2认同)
  • 所有应用程序都会在某个时候出现故障,这并不是 ASP.NET 独有的。您是否反对在 WinForms 应用程序中执行后台作业,因为用户可以随时单击关闭按钮?当服务器重新启动时,甚至 Windows 服务也需要关闭。这有什么不同? (2认同)

Pet*_*ter 10

您可以在global.asax中启动一个线程,但它只会运行直到您的asp.net进程被回收.这将至少每天发生一次,或者当没有人使用您的网站时.如果进程被回收,那么线程重新启动的唯一方法就是在您的站点上点击时.所以线程没有继续运行.

要获得持续的过程,最好启动Windows服务.

如果您执行"进行中"解决方案,它实际上取决于您正在做什么.线程本身不会导致内存或死锁问题.你应该添加一个meganism来停止你的线程在应用程序停止时.否则重启将花费很长时间,因为它会等待你的线程停止.


小智 5

这是一篇旧帖子,但当我为此进行搜索时,我想报告一下,在 .NET 4.5.2 中有一种使用 QueueBackgroundWorkItem 的本机方法。

看看这篇文章:https : //blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

马里亚诺


Reg*_*ser 1

我发现这篇关于如何使用异步工作线程的好文章,将尝试一下。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