非同期ページを使用すると、バックグラウンドスレッドによるユーザー体験とサーバ側のパフォーマンスの向上
2683 ワード
ASP.NetのWEB開発では,ユーザの操作応答が遅いという問題によく遭遇する.
このような状況の原因は、大量のメールを送信したり、万件以上の記録を挿入したり、大きなアップロードファイルを処理したりするなど、自分のユーザー操作が時間のかかる操作である可能性があります.
適用シーンによって異なる解決策があります.
1. 適用シーン1:
ユーザーが1万件以上の記録を含む可能性のある大きな電子メールアドレス帳ファイルをアップロードするアプリケーションに出会ったことがあります.
ASP.NETはこのアップロードファイルを受信した後、各レコードを処理してデータベースに挿入し、挿入が完了した後、コントロールをバインドし、結果をユーザーに提示する必要があります.
万件以上のレコードを挿入するのはかなり時間のかかる操作で、同時にアップロードするユーザーが多ければ、ASP.NETのスレッドプールでは、ワークスレッドが消費され、「サーバが使用できないエラー」が発生する可能性があります.
ソリューション:非同期ページ(Asynchronous Pages)を使用して、時間のかかる操作(万件以上のレコードを挿入)を非同期で実行します.
これでASP.NETのワークスレッドは、他の要求にサービスを継続し、時間のかかる操作が実行された後、UIレンダリングの仕事を担当することができます.
非同期ページを使用するか、ユーザーの応答が遅いという問題を解決することができず、サーバ側の性能を向上させるしかないため、クライアントは進捗バーなどの方案を使用して、ユーザーが待つ時にあまり退屈ではありません.
非同期ページについては、http://msdn.microsoft.com/zh-cn/magazine/cc163725(en-us).aspxを参照してください.
2.適用シーン2:
実際のサイトでは、データ統計、評価、データ更新などのバックグラウンド処理が頻繁に行われる可能性があります.これらのタスクは規則的ですが、時間がかかります.
ソリューション:
1)これらの一般的なタスクをバックグラウンドデータベースまたはMSMQに直接記録し,バックグラウンドプログラムのタイミングスキャンによって実行する.
私の傾向はデータベースに書くことで、直接的で、バックグラウンドでwindowsサービスやwinformを使ってデータベースを読み取り、順番にタスクを実行すればいいです.
MSMQは拡張しやすいと感じていますが、詳細はhttp://www.codeproject.com/KB/dotnet/Using_MSMQ_ASPnet_Window.aspxを参照してください.
2)Aspを採用する.Netのタイミング処理方式は,WEBサーバ層で直接処理する.
この方法は使用が少ないかもしれませんが、参考にしてください:http://hi.baidu.com/manly_001/blog/item/8474624a230f6d2508f7ef6c.html
3.適用シーン3:
シーン3はシーン1と似ています.違いは、シーン3がUI(大量のメールを送信するなど)を提示する必要がなく、時間のかかるタスクを処理する必要があることです.
そのため、ソリューションは比較的簡単で、ユーザーが待つ必要がなく、直接戻ることができ、ユーザー体験が良いです.
ソリューション:
1.
2.delegateを使用して
3.
Thread obj = new Thread(new ThreadStart());
obj.IsBackground = true;
この方法を推奨し,スレッドを共有できるようにスレッドプールを自分で実現できるようにhttp://www.codeproject.com/KB/threads/smartthreadpool.aspx参照
後記:
コードはビジネス上の理由で共有できないので、参考にした例を探してあげるしかありません.申し訳ありません.
他のアプリケーションシーンに遭遇したり、より良いソリューションがあったりする可能性があります.議論を歓迎します.
このような状況の原因は、大量のメールを送信したり、万件以上の記録を挿入したり、大きなアップロードファイルを処理したりするなど、自分のユーザー操作が時間のかかる操作である可能性があります.
適用シーンによって異なる解決策があります.
1. 適用シーン1:
ユーザーが1万件以上の記録を含む可能性のある大きな電子メールアドレス帳ファイルをアップロードするアプリケーションに出会ったことがあります.
ASP.NETはこのアップロードファイルを受信した後、各レコードを処理してデータベースに挿入し、挿入が完了した後、コントロールをバインドし、結果をユーザーに提示する必要があります.
万件以上のレコードを挿入するのはかなり時間のかかる操作で、同時にアップロードするユーザーが多ければ、ASP.NETのスレッドプールでは、ワークスレッドが消費され、「サーバが使用できないエラー」が発生する可能性があります.
ソリューション:非同期ページ(Asynchronous Pages)を使用して、時間のかかる操作(万件以上のレコードを挿入)を非同期で実行します.
これでASP.NETのワークスレッドは、他の要求にサービスを継続し、時間のかかる操作が実行された後、UIレンダリングの仕事を担当することができます.
非同期ページを使用するか、ユーザーの応答が遅いという問題を解決することができず、サーバ側の性能を向上させるしかないため、クライアントは進捗バーなどの方案を使用して、ユーザーが待つ時にあまり退屈ではありません.
非同期ページについては、http://msdn.microsoft.com/zh-cn/magazine/cc163725(en-us).aspxを参照してください.
2.適用シーン2:
実際のサイトでは、データ統計、評価、データ更新などのバックグラウンド処理が頻繁に行われる可能性があります.これらのタスクは規則的ですが、時間がかかります.
ソリューション:
1)これらの一般的なタスクをバックグラウンドデータベースまたはMSMQに直接記録し,バックグラウンドプログラムのタイミングスキャンによって実行する.
私の傾向はデータベースに書くことで、直接的で、バックグラウンドでwindowsサービスやwinformを使ってデータベースを読み取り、順番にタスクを実行すればいいです.
MSMQは拡張しやすいと感じていますが、詳細はhttp://www.codeproject.com/KB/dotnet/Using_MSMQ_ASPnet_Window.aspxを参照してください.
2)Aspを採用する.Netのタイミング処理方式は,WEBサーバ層で直接処理する.
この方法は使用が少ないかもしれませんが、参考にしてください:http://hi.baidu.com/manly_001/blog/item/8474624a230f6d2508f7ef6c.html
3.適用シーン3:
シーン3はシーン1と似ています.違いは、シーン3がUI(大量のメールを送信するなど)を提示する必要がなく、時間のかかるタスクを処理する必要があることです.
そのため、ソリューションは比較的簡単で、ユーザーが待つ必要がなく、直接戻ることができ、ユーザー体験が良いです.
ソリューション:
1.
System.Threading.ThreadPool QueueUserWorkItem , ASP.NET ( 25), 。
の使用2.delegateを使用して
BeginInvoke
メソッドを呼び出します.欠点は同じです.3.
System.Threading.Thread
クラスを使用します.Thread obj = new Thread(new ThreadStart(
obj.IsBackground = true;
この方法を推奨し,スレッドを共有できるようにスレッドプールを自分で実現できるようにhttp://www.codeproject.com/KB/threads/smartthreadpool.aspx参照
後記:
コードはビジネス上の理由で共有できないので、参考にした例を探してあげるしかありません.申し訳ありません.
他のアプリケーションシーンに遭遇したり、より良いソリューションがあったりする可能性があります.議論を歓迎します.