调用函数在特定的层间之后

时间:2015-12-02 09:20:59

标签: c#

我试图定期调用一个函数。

下面的代码写在global.asax.cs文件中,在 1分钟之后,ScheduleTaskTrigger()调用CheckLicenseExpiry()。但我也希望每次都使用这个功能,比方说 4小时

无论如何,通过更改此代码来实现此目的:

protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        //used here formating API//
        HttpConfiguration config = GlobalConfiguration.Configuration;
        config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

        ScheduleTaskTrigger();
    }
    static void ScheduleTaskTrigger()
    {
        HttpRuntime.Cache.Add("ScheduledTaskTrigger",
                              string.Empty,
                              null,
                              Cache.NoAbsoluteExpiration,
            //  TimeSpan.FromMinutes(60), // Every 1 hour
            // TimeSpan.FromMinutes(0.0167),
                              TimeSpan.FromMinutes(1),
                              CacheItemPriority.NotRemovable,
                              new CacheItemRemovedCallback(CheckLicenseExpiry));
    }

    static void CheckLicenseExpiry(string key, Object value, CacheItemRemovedReason reason)
    {
        CompanyHelper.CheckLicenseExpired();
    }

4 个答案:

答案 0 :(得分:1)

如果您愿意使用Windows窗体,请使用“计时器”类。

using System.Windows.Forms;

//[...]

Timer timer;
private void Initialiser()
{
    Timer timer = new Timer();
    timer.Interval = 3600000;//Set interval to an hour in the form of milliseconds.
    timer.Tick += new EventHandler(timer_Tick);
}
private void timer_Tick(object sender, EventArgs e)
{
    //The function you wish to do every hour.
}

您可以将间隔更改为以毫秒(每秒1000个)为单位的任何内容。 (例如1分钟:60000,4小时:14400000)。

P.S你可以使用“System.Windows.Forms”库而不必使用Windows Forms程序,我想你也可以在WPF中使用这个代码。)

答案 1 :(得分:1)

请使用System.Threading.TimerMSDN link)。它提供了一种以指定的时间间隔执行方法的机制,并且不依赖于平台:

new System.Threading.Timer(_ =>
    {
        // do something here
    }, 
    null, 
    TimeSpan.FromMinutes(1) /*dueTime*/, 
    TimeSpan.FromHours(1) /*period*/
);

答案 2 :(得分:1)

在您阅读示例时,您想要检查许可证是否已定期过期。使用ASP.NET缓存解决这个问题 - 这可能有效但可能并非在所有情况下都是如此(ASP.NET缓存是为了不同的目的而构建的)。此外,使用计时器不是一个好主意,因为Web应用程序的应用程序池可能没有运行,因此任务将不会执行。

相反,您可以检查每个请求是否已过期许可证。为了节省性能,您只能检查上次检查是否超过4小时前完成。

在ASP.NET MVC中,您可以创建实现此逻辑的ActionFilter或AuthorizationFilter。您可以将此过滤器全局应用于所有路由,也可以仅应用于特定路由/控制器/操作。

如果您想在检查不成功时阻止访问您的网站,则自定义AuthorizationFilter是一种很好的方法。有关ActionFilters的详细信息,请参阅此link,有关实施自定义AuthorizationFilter的示例,请参阅此link

在过滤器中,您应该知道可以存在访问存储上次检查时间的变量的并行请求。所以你需要以适当的方式锁定资源。

答案 3 :(得分:1)

我建议使用Quartz.Net

的Global.asax

public class Global : System.Web.HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        Scheduler.Start();
    }

    void Application_End(object sender, EventArgs e)
    {
        Scheduler.Stop();
    }
}

Scheduler.cs(帮助程序类)

using Quartz;
using Quartz.Impl;

public class Scheduler
{
    private static IScheduler _scheduler;

    public static void Start()
    {
        _scheduler = StdSchedulerFactory.GetDefaultScheduler();
        _scheduler.Start();

        ITrigger myTrigger = TriggerBuilder.Create()
            .StartNow()
            .WithSimpleSchedule(x => x
                .WithIntervalInHours(4)
                .RepeatForever())
            .Build();

        IJobDetail myJob = JobBuilder.Create<MyJobClass>().Build();
        _scheduler.ScheduleJob(myJob, myTrigger);
    }

    public static void Stop()
    {
        if (_scheduler != null)
        {
            _scheduler.Shutdown();
        }
    }
}

MyJobClass.cs

[DisallowConcurrentExecution]
public class MyJobClass : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        //do something
    }
}

我希望这会有所帮助。