C# webservice中的计时器在20分钟后停止工作

C# webservice中的计时器在20分钟后停止工作,c#,timer,garbage-collection,C#,Timer,Garbage Collection,我想我的计时器在一段时间后停止工作,我刚才测量了20分钟,到目前为止还没有发现任何其他导致计时器停止的原因。如果它的垃圾被收集了,我应该如何声明它不被收集 [WebMethod, SoapHeader("spAuthenticationHeader")] public void startStreaming() { if (Globals._streamTimer == null) Globals._streamTimer = new System.Threading.T

我想我的计时器在一段时间后停止工作,我刚才测量了20分钟,到目前为止还没有发现任何其他导致计时器停止的原因。如果它的垃圾被收集了,我应该如何声明它不被收集

[WebMethod, SoapHeader("spAuthenticationHeader")]
public void startStreaming()
{
    if (Globals._streamTimer == null)
        Globals._streamTimer = new System.Threading.Timer(handleStream, null, 0, 30000);
        return Globals._returnValue;
}


public static class Globals
{
    public static System.Threading.Timer _streamTimer = null;
}

看看你的IIS设置-20分钟

Web应用程序不应该长期运行。无论你在做什么,你都应该以不同的方式去做。可能是Windows服务,或持久存储和轮询

或者,您可以对其进行模糊处理并增加超时值


查看您的IIS设置-20分钟

Web应用程序不应该长期运行。无论你在做什么,你都应该以不同的方式去做。可能是Windows服务,或持久存储和轮询

或者,您可以对其进行模糊处理并增加超时值


服务器上的会话时间设置为多少?IIS在应用程序池上的空闲超时设置(高级设置)默认为20分钟…符合?服务器上的会话时间设置为多少?IIS在应用程序池上的空闲超时设置(高级设置)默认为20分钟…符合?不知道这一点。将超时设置为0并让它“永远”运行是否有任何危险?是的。您可以耗尽ASP.NET线程池中的可用线程。创建线程以服务请求,然后永远运行。如果内存泄漏或分配对象,则永远不会释放内存。如果应用程序崩溃,进程永远不会终止。你建造的模型真的很糟糕。考虑不同的模型。不确定您正在做什么,因为没有人会等待30分钟的web响应。很可能,您希望稍后触发某个web请求。使用Windows服务或其他设计可能会正确处理此问题。谢谢您的回答。我会调查一下。最有可能的是,当事件发生时,您的ASP.NET服务应该向单独的Windows服务发出信号(或将项目放入数据库)。数据库可能实现一个“触发器”,它将通知Windows服务,或者Windows服务可能只是定期轮询数据库。然后,长期运行的Windows服务将运行计时器或使用简单的轮询来检查时钟,然后在30分钟后执行任何操作。对于企业的关键需求,像数据库这样的持久性存储是必要的,这样重新启动就不会阻止操作的发生。现在一切正常。谢谢,我不知道。将超时设置为0并让它“永远”运行是否有任何危险?是的。您可以耗尽ASP.NET线程池中的可用线程。创建线程以服务请求,然后永远运行。如果内存泄漏或分配对象,则永远不会释放内存。如果应用程序崩溃,进程永远不会终止。你建造的模型真的很糟糕。考虑不同的模型。不确定您正在做什么,因为没有人会等待30分钟的web响应。很可能,您希望稍后触发某个web请求。使用Windows服务或其他设计可能会正确处理此问题。谢谢您的回答。我会调查一下。最有可能的是,当事件发生时,您的ASP.NET服务应该向单独的Windows服务发出信号(或将项目放入数据库)。数据库可能实现一个“触发器”,它将通知Windows服务,或者Windows服务可能只是定期轮询数据库。然后,长期运行的Windows服务将运行计时器或使用简单的轮询来检查时钟,然后在30分钟后执行任何操作。对于企业的关键需求,像数据库这样的持久性存储是必要的,这样重新启动就不会阻止操作的发生。现在一切正常。非常感谢。