2012-03-05 11 views
1

GUIとしてWPFを使用して、C#で簡単なLANチャットを作成しようとしています。私はサーバーレスのチャットを可能にしたいので、アプリケーションの各インスタンスがマルチキャストされたメッセージをIPでリッスンし、そのIPにマルチキャストを送信したいと思います。しかし、スレッドネットワーキングのためのさまざまなチュートリアルでは、ネット上では、独自のスレッドで設定されたWPFではなくコンソールを使用しています。私はこれらのチュートリアルを修正しようとしましたが、GUIスレッドのサスペンドやメッセージがGUIに処理/追加されていないなど、常に問題があります。コンシューマ/プロデューサのスレッドシステムに関するチュートリアルも素晴らしいでしょう。WPFフロントエンドを使用したスレッドネットワーキングのための.NETチュートリアル

答えて

1

あなたのシナリオとスレッド間通信のシナリオとの間には何も変わりませんが、あなたはWPFと他のスレッドの間で整理しているb/cを活用できる多くの自由な作業があります。

ショート・バージョン: ローカル・スタック内の別のクライアントからメッセージを受け取り、WPFに知らせる必要がある場合は、ネットワーキング・スレッドのDispatcher.Invokeを使用してWPFスレッドへの呼び出しをマーシャリングし、メッセージオブジェクトの。

まず、アプリの初期化中にバックグラウンドスレッドにWPFディスパッチャへの参照を保存します。あなたのWPFのスレッドがネットワークスレッドをスピンアップだものです(あなたが病理学的にマルチスレッド化されないと仮定した場合)ので、これは簡単です:

var guiDispatcher = Dispatcher.CurrentDispatcher; 

あなたの他のスレッドがGUIディスパッチャにアクセスすることができたら、それは非同期にコードを実行することができますそのディスパッチャのコンテキスト(私たちの場合は、WPFのGUIスレッド)上:

Message msg = myNetworkComms.GetMessage(); // or whatever 
Action updateGui =() => myViewModel.ApplyNewMessage(msg); 
guiDispatcher.BeginInvoke(DispatcherPriority.Normal, updateGui); // Run updateGui on GUI thread 

は、なぜあなたはあなたのネットワークI/Oのために別のスレッドをスピンアップしていると述べているすべての?それは非常にリソースの無駄に見えます。あなたが利用できる非同期ネットワークI/Oメソッドがないと確信していますか?

+0

私はそれが最も簡単だろうと考えました。しかし、非同期ネットワークI/Oを使用する方が簡単な場合は、それを調べます。 – T0xicCode

+0

両方のテクニックを使用して実際のサンプルを実装すると、関連APIの非同期メソッドがはるかに簡単になると思います。 :) –

1

これは最も簡単な例ではないかもしれませんが、それは私がGUIの回転を維持し、その後に入ってくるのコマンドのキューをチェックするDispatcherTimer Classを使用していmulitple AIのソケットhttps://github.com/bondehagen/CloudWars

によって接続されたとWPFのゲームです選手をコントロールする。このクラスは役に立つかもしれません。https://github.com/bondehagen/CloudWars/blob/master/Simulator/CloudWars.Gui/Helpers/WindowThread.cs

+0

私はそれを調べます。 – T0xicCode

関連する問題