Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何在后台创建任务_Asp.net_Timer_Background - Fatal编程技术网

Asp.net 如何在后台创建任务

Asp.net 如何在后台创建任务,asp.net,timer,background,Asp.net,Timer,Background,我想知道是否有可能创建后台任务,我的意思是,在asp.net中,每个用户都有自己的实例,所以如果我要创建一个计时器,当2个用户在上面时,它将创建2个我不想要的计时器实例 我基本上想要一个计时器,它是一个独立的实例。我之所以要这样做,是因为我想每隔5分钟左右进行一次SQL查询,我不希望两个用户同时运行它,因为这样就不会相隔5分钟,可能相隔2分30秒 USER1---ASP.NET实例 USER2---ASP.NET实例 定时器---与用户无关 我听说过web服务和Quartz.net之类的东西,但

我想知道是否有可能创建后台任务,我的意思是,在asp.net中,每个用户都有自己的实例,所以如果我要创建一个计时器,当2个用户在上面时,它将创建2个我不想要的计时器实例

我基本上想要一个计时器,它是一个独立的实例。我之所以要这样做,是因为我想每隔5分钟左右进行一次SQL查询,我不希望两个用户同时运行它,因为这样就不会相隔5分钟,可能相隔2分30秒

USER1---ASP.NET实例 USER2---ASP.NET实例

定时器---与用户无关

我听说过web服务和Quartz.net之类的东西,但我不确定这是否是我想要的


希望它有意义:)

实际上,Quartz.NET是最好的解决方案,因为它是为它量身定做的:按计划运行任务。 如果出于某些原因,您不想使用它,最简单的方法是在singleton类中使用Timer对象;您可以在global.asax中启动计时器,这将为您提供一个在所有用户之间共享的计时器。 比如:

    public class SingletonTimer
{
    private static SingletonTimer _instance = null;
    private Timer _myTimer;

    protected SingletonTimer()
    {
        _myTimer = new Timer(Callback, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
    }

    private void Callback(object state)
    {
        // SQL QUERY
    }

    public static SingletonTimer GetInstance()
    {
        return _instance ?? (_instance = new SingletonTimer());
    }
}

但是,这不是一个稳定的解决方案,因为在20分钟不活动后,IIS将杀死您的池,并且计时器将停止运行;最好的做法是在不同的进程(如windows服务)中托管Quart.NET调度程序。

好的,我看看它是否有效,然后将其标记为正确。:)你说在20分钟不活动后,IIS会杀死你的池,如果用户重新打开,它会再次启动吗?是的,会。池将像第一次连接一样启动,global.asax将再次运行,等等。