2011-08-05 9 views
0

Webページを作成するためにAsp .NET Mvc 3を使用し、20分ごとにデータベース内の何かを変更する必要があります... 私はGlobal.asax.csファイルにTimerを設定しました。ここでピティーは、それだけで1時間をどのような作品コードC#タイマーが正しく動作しません

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

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    Unit = new UnitOfWork(); 
    System.Timers.Timer timer = new System.Timers.Timer(); 
    timer.Interval = 1200000; //20 minutes 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed); 
    timer.Start(); 
} 

void Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    Unit.Srvc.UpdateUserActivity(); 
} 

今、私はそれを実行して、今日、とある... 20分後には、データベースを変更し、それがすべてです。

P.S.Yedayed私は20秒でそれをテストし、正常に動作します。しかし、今日、それは20分間隔で正しく働きたいとは思わない。ご協力ありがとうございます。

P.S.2データベースの更新にストアドプロシージャを使用しました。

PS3私はそれがランダムに動作することを検出します:D:5:32Am私はプログラムを実行します... 5:52Amで動作し、6:12Amで動作せず、今動作します:49午前、私はそれが動作するか分からない)。

答えて

4

ほとんどの原因は、アプリケーションが実行されていないことを意味する非アクティブなため、AppDomainがシャットダウンしている可能性があります。アイドルタイムアウトは20分の非活動です。あなたは(IISアプリケーションプールから)あなたのスレッドはリサイクルまたはシャットダウンされていることを発見される可能性があります

How to keep ASP.NET assemblies in AppDomain alive?

+0

私はちょうどlocalhostでテストしました...そして、アプリケーションはアクティブです;-) –

+2

+1 - これはおそらく問題です。しかし、私は本当にあなたがこの努力に行き、あなたのアプリケーションとサーバーのパフォーマンスと信頼性を助けるためにそこにあるIISの正常な振る舞いを覆すかどうかを考えていきます。 – Reddog

0

は、この質問を参照してください。

Webアプリケーションは、通常、このタイプの動作ではなく要求/応答処理に使用すると最も効果的です。 SQL Serverを使用していると仮定すると、データの非正規化(つまり、計算されたデータのロールアップ)が必要な場合に、メンテナンスタスクやトリガを調べる可能性があります。リクエスト/レスポンス処理中に収集されたデータが含まれている場合は、Webキャッシュと遅延永続性のキャッシュ有効期限操作を使用します。

0

私の推測でも、セッションは単に期限切れになりますが、少し余分に追加したいと思います。

コードを読む私は、データベース内のユーザーを「アクティブでない」、または切断されている、またはそのようなものとしてマークしていると思います。その場合は、代わりにset the session expiration(ユーザーが一定期間要求を送信していない場合)にタイマーを使用しないで、実行するコードを入力してください。the Session_OnEnd handler

1

私には、Application_Startからスコープの外に出た後、あなたの参照を保持していないので、あなたのタイマーがガベージコレクションによって殺されるようです。

関連する問題