0

独自の小さなネットワーク ライブラリを作成してネットワークを学習しようとしています。現在、このようなコードで使用できる新しいクライアントのリストがあります。NewClientConnected() メソッドは、リストに何かがある場合に true を返し、最初の要素を削除します。

ConnectedClient newClient; // ConnectedClient is my class storing it's socket and stream and all that.
if(NewClientConnected(out newClient)
{
...handling new client, notification, etc...
}

新しいパケット (ストリームのプレフィックス スライス) をチェックする場合も同様です。私はそれを次のレベルに引き上げようとし、このようなことが起こったときにイベントを発生させようとし、新しいつながりから始めました. 問題は、イベントが別のスレッドから発生し、イベントが form1.cs で処理されるときに例外が発生することです。

イベントが静的な非コントロール クラスのメイン スレッドによって処理されるようにするにはどうすればよいですか? 私は自分がしていることをやり続けるべきですか?(上記のスニペット) 消費者と生産者の関係のアイデアを聞いたことがありますが、正しく思い出すと、タイマー (独自のスレッドを使用) または別のスレッドが必要になります。

私はそれをググってここを見ようとしましたが、誰もが異なる問題を抱えているようです. 別のプロジェクト(私のサーバーとクライアントのテスト)がそれを参照している間、それはライブラリプロジェクトにあります。

前もって感謝します。

4

2 に答える 2

1

実行したい操作がユーザー インターフェイスとやり取りする場合は、UI スレッドでそれらを呼び出す必要があります。

したがって、イベントを直接処理する代わりに、次のことを試してください。

// Somewhere in the form1 code:
Server.newConnectionEvent += ConnectionEVentHandler(myMethod)

public void myMethod()
{
  //Event method called from another thread
  //can only do things here that do affect the UI!
  this.Dispatcher.Invoke(CalledOnUIThread);
}

public void CalledOnUIThread()
{
  //Handle event on UI thread here
  //Can do things here that affect the UI
}

このコードは「this」を使用するため、form1 クラスから実行する必要があります。したがって、変更するのは (おそらく、イベント ハンドラー コードを表示していない) ことだけです。実行する実際のコードを別のメソッドに配置し、その別のメソッドをイベント ハンドラーから呼び出します。

ディスパッチャ クラスの API ドキュメントについては、http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspxを参照してください。

UI スレッドの定義を参照してください。.NET アプリケーションの UI スレッドは 1 つだけですか? UI スレッドの簡単な説明。

于 2011-07-14T08:20:58.433 に答える
0

Control.Invoke および Control.BeginInvoke メソッドを見てください。

Control.Invoke - 「コントロールの基になるウィンドウ ハンドルを所有するスレッドで、指定されたデリゲートを実行します。」

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx

これにより、「別のスレッド例外」が修正されるはずです

于 2011-07-14T08:14:47.323 に答える