0

私はTCPクライアント/サーバーのこの例に従っています

www.codeproject.com/Articles/1415/Introduction-to-TCP-client-server-in-C

私はコンソール アプリケーションよりも WinForms に精通しているので、WinForms でコードを作り直すことにしました。クライアントとサーバーのコードは同じ形式です。サーバーを初期化するときに、AcceptSocket() を使用した後にフォームがスタックし、ボタンを使用してクライアント側からアクションを開始できません。これは、クライアントとサーバーを別々の WinForms でコーディングする必要があるということですか? =/

4

2 に答える 2

3

それらを別々のスレッドで実行する必要があります。UI スレッドをブロックしないようにしてください。ブロックしないと、UI が応答しなくなります。

于 2012-12-27T15:36:48.720 に答える
3

UI スレッドを拘束せずにソケットを読み取れるようにする必要があります。そうしないと、ウィンドウが応答しなくなります。

そのためには 2 つの選択肢があります。最初の、そして表面上最も簡単なのは、既に述べたように明示的にスレッドを使用することです。

2 つ目は、accept/read/write 関数 (使用する API に応じてBeginXXX/EndXXXまたはのいずれか) の非同期バージョンの 1 つを使用XXXAsyncすることです。これにより、スレッド プールから別のスレッドが開始されます。(Asyncバージョンは実際にはイベントが発生するまでスレッドを取得しませんが、Begin/Endはすぐにスレッドを取得する可能性があります。)ソケットを監視するために新しいスレッドを実際に専用にする必要がない限り(実際にはほとんどそうしません)、私は非同期のもの。

いずれにせよ、マルチスレッドについて少し学びたいと思うでしょう。この場合、覚えておく必要がある大きなことは、(1) どのように実行しても、ソケット関連の処理はほぼ確実に別のスレッドで行われるということです。(2) WinForms コントロールは、他のスレッドから直接アクセスされることを嫌います。Invoke代わりに、UI スレッドで処理を行うには、そのメソッドを使用する必要があります。

于 2012-12-27T15:43:30.923 に答える