2012-03-29 5 views
0

私はこのシンプルコードを作成して深夜毎にメソッドを実行しましたが、共有ホスト(不可能なWindowsスケジュールを作成しています)がありますが、これは機能しません。何か案が?TimerCallback in MVC3

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     ControllerBuilder.Current.DefaultNamespaces.Add("PhotoPremier.Controllers"); 

     var dt = NextAt(new TimeSpan(0, 0, 0)); // 
     var timer = new Timer(new TimerCallback(callback), HttpContext.Current, dt - DateTime.Now, TimeSpan.FromHours(24)); 

    } 

    static void callback(Object stateObject) 
    { 
     DbLayer.ContestManager cm = new DbLayer.ContestManager(); 
     cm.UpdateAllPhotosInContest(); 
    } 

    DateTime NextAt(TimeSpan time) 
    { 
     DateTime now = DateTime.Now; 
     DateTime result = now.Date + time; 

     return (now <= result) ? result : result.AddDays(1); 
    } 
+0

コードは、誰かがサイトを積極的に利用しているときにのみ実行されます。真夜中に誰もサイトにいない場合、コードは実行されません。 –

+0

私はこのコードが止まらないと思います!か否か?どのように私はこれをプログラマーですか? – AFetter

+1

ワーカープロセスがリサイクルされるとコードが停止しますが、これはさまざまな時に発生します。他のユーザーがログインするまでは再開しません。 –

答えて

0

を。

シンプルでシンプルなコードです。

public class DailyJob : IJob 
{ 
    public DailyJob() { } 

    public void Execute(JobExecutionContext context) 
    { 
     try { 
      DbLayer.ContestManager cm = new DbLayer.ContestManager(); 
      cm.UpdateAllPhotosInContest(); 
     } catch(Exception e) { 
      //Handle this please 
     } 
    } 

    public static void ScheduleJob(IScheduler sc) 
    { 
     JobDetail job = new JobDetail("FinishContest", "Daily", typeof(DailyJob)); 
     sc.ScheduleJob(job, TriggerUtils.MakeDailyTrigger("trigger1", 0, 0)); 
     sc.Start(); 
    } 
} 

//Global.asax 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 

      /* HERE */ DailyJob.ScheduleJob(new StdSchedulerFactory().GetScheduler()); 
     } 
+0

ローカルマシンでは動作しますが、サーバーでは動作しません! – AFetter

1

これは、共有ホスティングのIIS設定が原因である可能性があります。

デフォルトでは、IIS構成は、誰もアクセスしないで一定時間が経過するとアプリケーションをシャットダウンします。また、IISは数分ごとにアプリケーションプールをリサイクルします。

この設定を制御できない限り、アプリを稼働させてタイマーのトリガーを起動するのは難しいでしょう。

このような状況を明確にし、また他の代替案を提案するために、私はあなたの次のリンク与える:私はユニークなソリューションがQuarts.Netフレームワークを使用していると思う

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

0

私は最近、同じことをしようとしていた、私は私の問題は、どこかでそれがガベージコレクトの取得というのが私のTimerオブジェクトを宣言したことを発見しました。 timerをApplication_Startでローカルに宣言するのではなく、クラスのメンバーにすると、元のポスターのコードが動作すると思います。

これは誰かを助けることを望みます。