7

ASP.NET アプリケーションの場合、定期的に (毎日、毎時間など) メンテナンス プロセスを実行する必要があります。

サーバー上のスケジュールされたタスクのような外部プロセスに依存せずにこれを達成するための最良の方法は何ですか (サーバーへのアクセス権がないと仮定します - 共有ホスティング環境)。

4

5 に答える 5

12

StackOverflow がそれを行う方法は次のとおりです。

private static CacheItemRemovedCallback OnCacheRemove = null;

protected void Application_Start(object sender, EventArgs e)
{
    AddTask("DoStuff", 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 k, object v, CacheItemRemovedReason r)
{
    // do stuff here if it matches our taskname, like WebRequest
    // re-add our task so it recurs
    AddTask(k, Convert.ToInt32(v));
}

詳細: [https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/][1] [1]: https://blog.stackoverflow.com/2008/07/easy -background-tasks-in-aspnet/

于 2008-09-05T13:43:38.497 に答える
2

スケジュールされた時間に実行する必要はなく、「たまに」クリーンアップする必要がある場合の 1 つの方法は、Global.asax Session_OnEnd() で関数を作成することです。 1 から 100 までの数を指定し、その数がたとえば 50 の場合は、メンテナンス タスクを実行します。

もちろん、「100」を減らして、タスクをより頻繁に実行することもできます。

また、「ASP.NET を使用してスケジュールされたジョブを実行する Windows サービスをシミュレートする」という記事がhttp://www.codeproject.com/aspnet/ASPNETService.aspにあり、期限切れキャッシュを使用してタイマーをシミュレートしています。ホストされている任意のサイトで実行できると主張しています。

最後のものを使用している場合は、この手法に関する投稿からこのコメントを読んでください。

実行中のタスクの長さに本当に注意する必要があります。すべての新しいタスクは新しいワーカー スレッドであり、マネージド スレッド プールからスレッドを「借用」するため、その数は限られています。

フレームワークの v3.5 から、スレッドの最大数が 25 から 250 に 10 倍になりました。マネージド スレッド プールで使用可能なスレッドが不足すると、応答時間は非常に長くなります。

ここで実際に書いているのは、メッセージング/キューイング システムです。

キャッシュの更新などを行っている場合は、必ず新しいタスクを開始してください。セカンダリ HTTP リソースのダウンロードや、ある種の集中的なデータベース作業などを行っている場合は、Windows サービスを作成し、毎回どれだけ「噛む」かをより細かく制御できるキューを使用します。

于 2008-09-05T13:40:23.260 に答える
2

キャッシュ ソリューションは単純なケースでは機能しますが、スケジュールを変更する必要がある場合はうまくいきません。代わりに、人気のある Java フレームワークQuartzのポートであるQuartz.NETを使用できます。これは非常に柔軟です。

于 2009-01-24T16:45:06.967 に答える
1

StackOverflow がこれを行う方法は間違いなくユニークですが、関連しているため、この質問も監視することをお勧めします。

于 2008-09-05T13:57:26.980 に答える
0

これは外部プロセスであり、どれほど信頼できるかはわかりませんが、常にwww.webcron.orgにあることがわかっているマシンに同様のものを設定できます。

基本的には、リクエストしたスケジュールでリクエストしたページにヒットすることです。

基本的に、定期的なスケジュールでページにアクセスして、メンテナンス タスクを開始することができます。

Jeff と Joel は、最近のポッドキャストで、他の方法で同様のことを行うことについても話しました。

于 2008-09-05T13:44:50.130 に答える