1

NetworkStream.BeginRead() と WinForms クラスの間で、あるスレッドから別のスレッドへの通信を取得する際に深刻な問題が発生しています (スレッド化や非同期呼び出しなどのトピックに関しては、私は本当に初心者です)。

特に、ネット ソケットを介してリモート クライアントに接続し、単にイベントをリッスンしています。受け取ったら、NetworkStream の BeginRead() メソッドと EndRead() メソッドを使用して文字列に正しく収集できます。問題はありません。次に、情報をユーザーに表示できるように、(フォームのコンストラクターで文字列をパラメーターとして使用して) 新しいフォームを開くつもりです。事実上、ネットワーク イベントは、ユーザーが開くフォームと情報をトリガーします。しかし、私は常に CrossThreadMessagingExceptions に出くわします。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

ルールは次のとおりです。「コントロールにアクセスできるのは、それらが作成されたスレッドのコントロールのみです」

非同期コールバックは別のスレッドで返されるため、フォーム間で通信する場合はUIスレッドにマーシャリングする必要があります。

コードがすでにフォームに含まれていると仮定するとNetworkStream、InvokeまたはBeginInvokeを使用する必要があります。例えば:

private void MyAsyncCallback(IAsyncResult ar)
{
    var yourString = ...from your socket...;
    this.Invoke(new MethodInvoker(() => new Form(yourString)));
}
于 2012-03-01T05:00:11.433 に答える