2009-08-11 68 views
2

我正在建立一个网站,在定时比赛上运行。每隔n小时,比赛就结束。asp.net触发事件在服务器上的时间间隔

我会在哪里把运行代码在固定的时间间隔?

我在想一个页面请求时每次检查的,但我一直在寻找另一种方式。

谢谢你的时间。

回答

2

如果你真的由您的主机你可能想尝试一下这种方法的限制:http://www.apterasoftware.com/Blog/Post/09-04-09/Scheduled_ASP_NET_Task_ASP_NET_Cron_Jobs.aspx

这是一个黑客攻击的一位,但节省了托管你的钱! :)

+0

太棒了!看看如何使用谷歌差异产生不同的结果。 感谢:-) – 2009-08-11 03:03:07

+0

新的链接,该博客: http://www.apterasoftware.com/Blog/Post/09-04-09/Scheduled_ASP_NET_Task_ASP_NET_Cron_Jobs.aspx – 2010-06-23 14:51:10

0

如果你有你的数据库服务器的完全访问权限,你可以做一些简单的像创建一个可在1小时一班调用,将设置活动比赛ID的过程中,关闭其中的其他数据库程序SQL代理作业可以工作。

+0

我GoDaddy的托管。数据库访问是有限的。 – 2009-08-11 02:50:25

0

ASP.NET是用来帮助您创建它们投放在每个请求的网页的技术。因此,它不适合离散定时执行。有解决方案(例如检查每个请求,如你所说),但为什么不使用C#控制台或WinForms应用程序创建一个简单的定时过程在您的服务器上运行,使用相同的数据库?

+0

我对Web服务器的访问权限有限。有没有我可以使用的后台线程类型实现? – 2009-08-11 02:51:07

0

我认为这将是非常适合在一个单独的DLL跟踪的时间为比赛做,然后对请求请求asp.net页面,如果时间到了。我认为试图在asp.net页面中跟踪这个将证明是非常困难和难以维护的。

0

一对夫妇的想法:

  • 创建一个类,设置一个计时器,并指定一个回调或事件处理程序将调用时,计时器经过。您可以在应用程序启动,会话启动或响应页面中的操作时创建该类的实例,具体取决于您希望定时器启动的方式和时间。然后,您可以将该实例添加到ASP.NET会话或应用程序状态。在计时器过去的回调中,对象可以从应用程序或会话字典中删除自己,并在其中添加另一个值,并使用已知密钥来指示时间已到。然后每个页面都可以从应用程序或会话状态获取这个已知密钥并检查其值。如果设定了,时间到了。否则,仍然有时间让用户继续。
  • 在ASP.NET应用程序中设置FileSystemWatcher并监视特定文件的更改。然后有一个计时器在计时器到期时触摸该文件的另一个进程。然后,文件更改事件处理程序可以设置一些变量可见的页面或将某些东西粘贴到ASP.NET应用程序状态,每个页面将其拉出并检查时间是否到了。您可以使用其他流程作为管理工具来管理考试时长。
+0

我喜欢你的第一个想法,第二个似乎靠不住: - )感谢您的答复:) – 2009-08-12 06:25:30

0

以下内容来自Jeff Attwood的Easy Background Tasks in ASP.NET,并转入Global.asax。我正在计划从Active Directory中更新一些用户信息。目前,它被硬编码为每60秒重复一次,但会作为配置设置推入到Web.config中。适用于我的目的,我的请求数量比Stack Overflow少很多,所以我相信这将是一个很好的长期解决方案。

private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
private static readonly string UPDATE_USER_INFO_KEY = "UpdateUserInfo"; 
private static CacheItemRemovedCallback OnCacheRemove = null; 
void Application_Start(object sender, EventArgs e) 
{ 
    AddTask(UPDATE_USER_INFO_KEY, 60); 
} 

private void AddTask(string name, int seconds) 
{ 
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); 
    HttpRuntime.Cache.Insert(name, seconds, null, 
     DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, 
     CacheItemPriority.NotRemovable, OnCacheRemove); 
} 

public void CacheItemRemoved(string key, object v, CacheItemRemovedReason r) 
{ 
    if (UPDATE_USER_INFO_KEY.Equals(key)) 
    { 
     try 
     { 
      new Search().UpdateUserInfo(); 
     } 
     catch (Exception ex) 
     { 
      logger.Error("UpdateUserInfo threw an exception: {0} {1}", ex.Message, ex.StackTrace); 
     } 
    } 

    AddTask(key, Convert.ToInt32(v)); 
} 
相关问题