2012-03-05 20 views
1

我想在c#中使用WPF作爲GUI構建一個簡單的局域網聊天。由於我想啓用無服務器聊天,因此我希望每個應用程序實例都可以在IP上監聽多播消息,並將多播發送到該IP。但是,我在網上找到的所有用於線程化網絡的教程都使用控制檯,而不是WPF,它是在它自己的線程中設置的。我嘗試過修改這些教程,但總會有一些失敗的情況,比如GUI線程暫停,或者消息沒有被處理/添加到GUI中。關於消費者/生產者線程系統的教程也會很好。一個用於WPF前端線程聯網的.NET教程

回答

1

除了你有很多免費的工作,你可以利用你在WPF和其他線程之間編組的b/c之外,你的場景和任何其他線程間通信的場景之間沒有什麼不同。

簡短版本: 當您從本地堆棧中的另一個客戶端收到消息並且需要讓WPF知道時,請使用網絡線程中的Dispatcher.Invoke將一個調用編組到WPF線程,可能會傳遞給它一些類型消息對象。這對於lambdas來說非常容易:

首先,在應用程序初始化期間在後臺線程上存儲對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 2012-03-11 05:19:53

+0

如果你使用這兩種技術實現一個工作示例,我想你會發現相關API上的異步方法要簡單得多。 :) – 2012-03-11 07:00:41