我试图定期调用一个函数。
下面的代码写在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();
}
答案 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.Timer
(MSDN 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
}
}
我希望这会有所帮助。