2011-07-14 6 views
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で処理される際に例外が発生することです。

静的な非制御クラスのメインスレッドによってイベントが処理されるようにするにはどうすればよいですか?私は自分のやることをし続けるべきですか? (上記のスニペット)私は、コンシューマ・プロダクションの関係についての考えを聞いています。正しくリコールするには、タイマー(独自のスレッドを使用)または別のスレッドが必要です。

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

ありがとうございます。

答えて

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

ユーザーインターフェイスと対話実行する操作は、あなたはUIスレッド上でそれらを起動する必要がある場合、これはあなたの「別のスレッドの例外」

+0

このソリューションはWinFormsで動作します。 – Ondra

+0

処理されたイベントで行われたすべての変更でControl.invokeが必要な場合、古いシステム(if-conditionsのリストを持つタイマー付きタイマー)はより効果的です。 –

+0

このアプローチはDispatcherのものとほぼ同じです。違いはControl.InvokeはWinForms、Dispatcher.InvokeはWPF用 – Ondra

1

を修正する必要があります。

代わりに直接イベントを処理するので、これを試してみてください。

// 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 
} 

このコードそれがこの "を使用しているため、Form1クラスから実行する必要があります。イベントハンドラコードを表示していない場合は、実際のコードを別のメソッドで実行し、イベントハンドラからその別のメソッドを呼び出します。

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

UIスレッドの簡単な説明については、What is the definition of a UI thread? Is there only one UI thread in a .NET application?を参照してください。

+0

そのディスパッチャを静的クラスで使用するにはどうすればよいですか?または、私はクライアント側でサーバ/成功接続を初期化する際にインスタンス化される何らかのイベントスローナクラスを作成する必要がありますか? –

+0

これはform1.csで使用し、フォームクラスは静的ではありません。私はasnwerを明確にしようとします。 – Onots

+0

イベントは、ライブラリの静的クラスからスローされます。私は、ライブラリプロジェクトがこのコードを持っていることに頼っているプロジェクトに頼っているのは悪いことです。むしろ、上記の解決方法を、DLLのアセンブリの外部からメソッドを呼び出すよりも使用します。私がそれを参照によってフォームにリンクすることができれば、マルチフォームプログラムやUnity3Dをどう扱うべきですか? –

関連する問題