2011-03-08 12 views
3

私の仕事は、30分ごとに自動的に実行されるコードでASP.NETアプリケーションを作成することです。このコードは30分ごとにファイルにレコードを追加する必要があります。ユーザーの要求(発生するかどうか)に依存してはいけません。
1)私は自分のコードをGlobal.asaxファイルのApplication.Startメソッドに書いています。私は正しい?
2)ホスト設定(IIS)の設定(ファイルの書き込み権限の変更など)と関連がありますか?ASP.NETでの自動コード実行

私は既に、Application.Startメソッドのループにファイルに書き込むコードを入れてから、プロジェクトディレクトリをサーバーにコピーしました。しかし、それは動作しませんでした。

答えて

1

あなたは、ASP.NETを使用するように強制している場合は、私がお勧め技法hereが見つかりました。これは、キャッシュの有効期限を使用してASP.NETを実行し、イベントを発生させてタイマーに保存します。しかし、あなたのアプリが死ぬと、アプリを起動してページがリクエストされるまで、タイマーは再起動しないという危険性が常にあります。

実際にはまったく存在しないので、信頼できるものが必要な場合は、おそらくWindowsサービスでこれを行う必要があります。

4

ユーザーに依存せずに別のスレッドを実行して実行する必要があります。それをApplication.Startイベントのループに入れておくと、基本的にアプリケーションがデッドロックされます。

void Application_Start(...) 
{ 
    Thread thread = new Thread(CronThread); 
    thread.IsBackground = true; 
    thread.Start(); 
} 

private void CronThread() 
{ 
    while(true) 
    { 
     Thread.Sleep(TimeSpan.FromMinutes(30)); 
     // Do something every half hour 
    } 
} 
+1

私はサービスやQuartzを提案しようとしていましたが、投稿した内容を全く考えていない、全く新しいアプローチです。これが実際にうまくいくかどうかわかりません。 – kd7

1

いいえ、そのようなコードはApplication_Startメソッドには含まれません。このメソッドは、アプリケーションが最初に実行されたとき、またはリセットされたときに呼び出され、「30分ごと」とは何の関係もありません。

これを処理する最善の方法は、別のアプリケーションを、同じコンピュータまたは「ファイル」にアクセスできる別のコンピュータ(別の意味で)に作成することです。 ASP.NETはタイマーイベント用に設定されておらず、ASP.NETでそれを行う試みはほとんどあなたのウェブサイトのパフォーマンスに影響する可能性があります。

3

これはASP.Netアプリケーションでこれを行う場所です(これについては、Paulsポストを参照してください)。しかし、この方法でタスクを実行すると、いくつかの欠点がありますアプリケーションが実行するとき(つまり、最初のユーザーが自分のサイトにアクセスしたとき)にタスクが実行されることです - ASP.netワーカープロセスが停止し、何らかの理由でアプリケーションを再起動しない場合、 "バックグラウンドタスク"が停止しますあまりにも。

これは受け入れられるかもしれませんが、そうでない場合、私のアプローチは、これをWindowsサービスとして書くか、別の実行可能ファイルとして実行して、半時間ごとにスケジュールされたタスクを実行します。

C#を使用して、簡単なWindowsサービスを作成する方法の例については、このリンクを参照してください: