2012-02-29 8 views
1

あるスレッドからNetworkStream.BeginRead()とWinFormsクラス間で通信を行う際に重大な問題が発生しています(スレッドや非同期呼び出しなどの話題には本当に初心者です)。C#WinformsとNetworkStream.BeginRead()、ネットワークイベントに基づいて新しいフォームを開く方法は?

特に、私はネットソケットを介してリモートクライアントに接続しており、単にイベントを待ち受けています。私が受け取ったとき、私は正しくNetworkStreamのBeginRead()とEndRead()メソッドを使って文字列にそれを集めることができます。問題はありません。私はその後、情報をユーザーに表示できるように、新しいフォーム(フォームのコンストラクターでパラメーターとして文字列を使用する)を開きます。効果的に、ネットワークイベントは、ユーザーが開くためのフォームと情報をトリガーします。しかし、私はCrossThreadMessagingExceptionsを常に巡って来ており、私はそれを正しくやっていると確信している代議員には馴染んでいません。誰かが正しい方向に私を向けることができるだろうか?

答えて

1

ルールがある:あなたが非同期コールバックは別のスレッドに戻って来ているので、あなたがしたい場合は、あなたが戻ってUIスレッドにマーシャリングする必要が

を「あなたは、彼らが作成されているスレッド上でのみアクセス制御をすることができます」フォーム間の通信。

NetworkStreamコードがすでにフォームに入っていると仮定すると、InvokeまたはBeginInvokeを使用するだけで済みます。たとえば、次のように

private void MyAsyncCallback(IAsyncResult ar) 
{ 
    var yourString = ...from your socket...; 
    this.Invoke(new MethodInvoker(() => new Form(yourString))); 
} 
関連する問題