2

非同期処理が必要なC#の.Netアプリケーションがあります。ユーザーはaspxページからPEOPLEレコードのファイルをアップロードし、システムはファイルをアップロードし、ファイルを解析し、データベース内のユーザーをロードしてから、アップロード先の初期ディレクトリからファイルを移動する必要があります。

一部のファイルには数千のレコードが含まれている可能性があり、システムがそれらすべてを処理するのに時間がかかる可能性があるため、ユーザーがこれを待つ必要はありません。基本的に、「ファイルをアップロードしていただきありがとうございます。システムがファイルを処理し、完了するとメールを送信します」というメッセージを返したいと思います。

私は新しいasync/awaitキーワードについて読みましたが、それが私がこれのためにとるべきルートであるかどうかはわかりません。基本的には、ファイルをアップロードするためのボタンイベントハンドラーと、ファイルの処理を終了するための「バッチ」プロセスを開始するだけで、UIのユーザーに制御を戻し、サイトでやりたいことをすべて実行できます。

2番目の質問は次のようになると思います:ボタンイベントハンドラーメソッド内で使用された場合、ユーザーに制御を返すのを待ちますか?もしそうなら、それはスレッドやユーザーをブロックしないので、これは私にとって完璧な解決策のようです。

これに使用する必要のあるより良い方法やパターンはありますか、それともasync / awaitで十分ですか?

4

3 に答える 3

2

二次的な質問は次のようになると思います:ボタンイベントハンドラーメソッド内で使用された場合、await はユーザーにコントロールを返しますか? もしそうなら、スレッドやユーザーをブロックしないので、これは私にとって完璧な解決策のようです。

awaitGUI アプリケーションのボタン イベント ハンドラ メソッド内で使用すると、メッセージ ループが発生します。

これに使用する必要があるより良い方法またはパターンはありますか、それとも async/await で十分ですか?

async/awaitはこれを行いasyncません。HTTP プロトコルを変更しないためawaitです。(ユーザーのブラウザーではなく) ASP.NET スレッド プールを使用するだけです。

これを解決する最善の方法は、ASP.NET ページでファイルをディスクに (可能であれば非同期で) 書き込み、「完了したらメールでお知らせします」という応答を返すことです。

次に、そのディレクトリを監視し、ファイルを処理し、電子メールを送信する Win32 サービスまたは何かを使用できます。これをクラウドにデプロイする予定がある場合は、ファイル システムの代わりに Azure Blobs/Queues を使用する必要があることに注意してください。

于 2012-09-11T18:58:03.217 に答える
1

非同期ページを使用できます-に基づいて<%@ Page Async="true" ... %>

リンク: http: //msdn.microsoft.com/en-us/magazine/cc163725.aspx

于 2012-09-11T18:01:35.997 に答える
0

ASP.NET/ThreadPoolを使用してファイル解析/データベース作業/電子メール通知を処理することに慣れている場合は、HttpModule/Timerを使用してこれを実装できます。ASP.NETを使用してファイルとHttpModuleをアップロードし、ファイルシステムで新しいアップロードを監視してファイルを処理するか、ファイルのアップロード時にデータベースレコードを追加して、データベースで新しいレコードを定期的にポーリングします。

この記事では、この方法を使用して直面する可能性のある問題について概説します。

より複雑なものが必要な場合、またはサイトに大量のトラフィックがある場合は、バッチプロセスに別のプロセス(Windowsサービスまたはスケジュールされたタスク)を使用することをお勧めします。

サンプルコードが必要な場合は投稿できますが、現在は4.0ではなく.NET3.5を使用しています。

于 2012-09-12T03:12:43.917 に答える