0

クライアントは、数百のレコードを持つ外部ソースからデータベースの更新を開始するボタンを備えたasp.netページを望んでいます。このプロセスには長い時間がかかります。彼はまた、「1000レコードのうち10レコードを処理する」など、プロセスの実行中にステータスを更新することも望んでいます。いろいろな記事を読んで、データベース更新コードをWindowsサービスに入れることを考えています。私はこれまでWindowsサービスを使用したことがなく、Windowsサービスを起動してasp.netページからポーリングする方法に関するチュートリアルを多く見つけることができません。私の質問は、これがこのプロセスを処理するための最良の方法ですか?そして、これをどのように達成したかについての例はありますか?

4

2 に答える 2

4

これにアプローチする方法はいくつかあります。

Webのワーカープロセス内で長時間実行されるタスクを実行すると、通常はうまく終了しません。リソースが占有されたり、アプリプールがリサイクルされたりする可能性があります。複雑なプロジェクトのほとんどでは、通常、終了します。データベース、私のモデルを含むDLL、Windowsサービスである「ワーカー」、およびASP.NETWebサイトの4つで構成されています。

「ワーカー」は、常に実行されているWindowsサービスであり、Quartz.netを使用して、Webサイトが使用しているのと同じモデルを使用してスケジュールされたタスクを実行します。VacuumExpiredPickTicketsJobこれらは、、、、などBackupAndFtpDatabaseJobの複雑なWebサイトを維持するときに発生するように見えるあらゆる種類の定期的なタスクである可能性があります。SendBackorderReminderEmailsJob

C#ではWindowsサービスの作成は難しくありません(Visual Studioには組み込みのテンプレートがありますが、ほとんど継承しているので、競争に参加できません) 。TopShelfServiceBaseなどのライブラリを使用すると、Windowsサービスの展開がさらに簡単になります。

残っているのは、Webサイトからの更新をトリガーし、結果をユーザーに通知することです。これは、必要に応じて単純または複雑にすることができます。これが多くのユーザーにスケールアップする必要がある場合は、MSMQなどを使用して更新コマンドをWindowsサービスにキューに入れると、Windowsサービスがそのキューに応答します。ここではおそらくやり過ぎだという印象を受けます。

少数のユーザーの場合、サービスのOnCustomCommand(int command)メソッドをオーバーライドしてトリガーにすることができます。次に、WebサイトはServiceControllerクラスを使用ExecuteCommand()プロセスを開始します。あなたのWebサイトとサービスは、「その更新を行う」という意味のパラメーター値に同意します142(たとえば、履歴上の理由から、128から255までの数値である必要があるため)。

進捗状況をクライアントに通知する場合は、WebページでタイマーとAJAX呼び出しを使用して、更新された進捗状況データをポーリングするのがおそらく最も簡単です。WebSocket(私がこれを書いているときの最先端のもの)や長いポーリングのような新しいものに夢中になることができますが、定期的なポーリングは、スケーリングする必要のないものに対しては単純に機能します。

お役に立てれば!

于 2012-11-02T02:10:49.540 に答える
1

Nicholasの徹底的な回答に加えて、別のオプションは、バックエンドプロセスをコマンドラインスクリプトとして展開し、WindowsServer2008以降で大幅に改善されたWindowの組み込みタスクスケジューラを介して実行するようにスケジュールすることです。または、他のホストのタスクスケジューラアプリケーションを使用することもできます。

コマンドラインアプローチは、標準のWindowsサービスと比較して、MISスタッフが理解して構成し、新しいサーバーに移行する方が簡単だと思います。

于 2012-11-02T02:32:01.440 に答える