ミニサーバータイプのものを起動してローカルブラウザにWebページを提供するwinフォームがありますが、問題は、起動すると、要求を待機するループがあるため、アプリケーションが明らかに実行されないことです。リクエストごとに新しいスレッドを作成します。プロセス全体に対して完全に新しいスレッドを作成する必要がありますか、それとも別の方法がありますか?クラスは、私が作成した別のdllファイルにあります。単独では、期待どおりに完全に機能します。
3 に答える
ここには 2 つの方法があります。
非同期サーバー。より難しく、より多くのパフォーマンス。http://robjdavey.wordpress.com/2011/02/12/asynchronous-tcp-server-example/
クライアントごとに 1 つのスレッド。書くのは簡単ですが、クライアントが多い場合は当てはまりません。http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server
リクエストまでループを使用しないでください
ThreadPool Classをご覧になることをお勧めします。これは、複数のスレッドを処理するための使いやすいオプションです。
スレッド プールを使用すると、システムによって管理されるワーカー スレッドのプールをアプリケーションに提供することで、スレッドをより効率的に使用できます。
実行のためにメソッドをキューに入れるには、単純にQueueUserWorkItem Methodを使用します。
ThreadPool.QueueUserWorkItem(state =>
{
// do some work!
});
クライアントにサービスを提供するために、より多くのアクティブな同時スレッドが必要であることに気付いた場合は、SetMaxThreads メソッドを呼び出します。
ThreadPool.SetMaxThreads(50, 10);
ワーカー スレッドと I/O スレッドのこれらの数を超えるすべての要求は、スレッド プール スレッドが使用可能になるまでキューに入れられたままになります。
@Thomas の提案に従いますがwaitHandles
、ThreadPool に追加してコールバック サイクルを管理します。
WaitCallback classMethod1= new WaitCallback(DoClassMethod1);
bool isQueued = ThreadPool.QueueUserWorkItem(classMethod1, waitHandle[0]);
WaitCallback classMethod2= new WaitCallback(DoClassMethod2);
bool isQueued = ThreadPool.QueueUserWorkItem(classMethod2, waitHandle[1]);
// do this if you want to wait for all requests complated
if (WaitHandle.WaitAll(waitHandles, 5000, false))
// request completed, show your result.
else
// problem.
void DoClassMethod1(object state)
{
// do your work
ManualResetEvent mre = (ManualResetEvent)state;
mre.Set();
}