我想在c#中使用WPF作爲GUI構建一個簡單的局域網聊天。由於我想啓用無服務器聊天,因此我希望每個應用程序實例都可以在IP上監聽多播消息,並將多播發送到該IP。但是,我在網上找到的所有用於線程化網絡的教程都使用控制檯,而不是WPF,它是在它自己的線程中設置的。我嘗試過修改這些教程,但總會有一些失敗的情況,比如GUI線程暫停,或者消息沒有被處理/添加到GUI中。關於消費者/生產者線程系統的教程也會很好。一個用於WPF前端線程聯網的.NET教程
回答
除了你有很多免費的工作,你可以利用你在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方法可以利用嗎?
這可能不是最簡單的例子,但它是一個WPF遊戲多張AI的通過插座https://github.com/bondehagen/CloudWars
我使用的是DispatcherTimer Class保持GUI紡紗,然後連接檢查隊列傳入的命令控制球員。這個類可能是有用的https://github.com/bondehagen/CloudWars/blob/master/Simulator/CloudWars.Gui/Helpers/WindowThread.cs
我會研究它。 – T0xicCode 2012-03-11 05:21:34
- 1. 用於聯網的Python線程 - 線程不能並行運行
- 2. 用於Kurento的iOS客戶端教程
- 3. WPF應用程序前端後端
- 4. 線程和聯網
- 5. WPF DataTemplate教程
- 6. .NET Remoting教程
- 7. 關於在.NET中構建Webhook端點的教程?
- 8. 另一個線程WPF
- 9. 用於創建CodedUI教程的良好WPF應用程序
- 10. Posix線程教程
- 11. 線程使用模式(.net wpf)
- 12. 關於.NET中的線程
- 13. WPF Silverlight的.Net的4線程轉換
- 14. .NET Micro Framework教程?
- 15. .NET to Java教程
- 16. 關於Django的前言和教程
- 17. c linux多線程聯網
- 18. 線程:網絡線程,gui線程,後端線程郵局中介類一個好的設置?
- 19. 可下載的WPF教程
- 20. 用於前端應用程序的OAuth2
- 21. 關於在jdbc中使用多線程的教程
- 22. 用於使用WPF的.NET 4應用程序的Mono端口的GUI
- 23. 我需要一個多線程WPF應用程序用於這種情況嗎?
- 24. 多線程基本教程
- 25. 線程教程需要
- 26. C++多線程教程
- 27. WPF .Net編程
- 28. 尋找一些UI線程和工作線程教程
- 29. 基於互聯網的應用程序
- 30. 多線程客戶端上的BOOST教程?
我認爲這將是最簡單的。但是,如果使用異步網絡I/O更容易,那麼我會研究它。 – T0xicCode 2012-03-11 05:19:53
如果你使用這兩種技術實現一個工作示例,我想你會發現相關API上的異步方法要簡單得多。 :) – 2012-03-11 07:00:41