簡體   English   中英

c#.Net 4.5線程之間的通信

[英]c# .Net 4.5 Communication between threads

我正在構建一個可以實時監視某些MCU硬件(傳感器讀數等)的應用程序。 為了進行通訊,我使用了CAN總線。

基本上我現在有2個線程。 一個是運行GUI的主線程,另一個是管理/監視設備之間的通信。 因此,顯而易見的是,我需要將數據從通信線程傳遞到gui線程。 但是,正確的方法應該是什么? 我知道在子線程完成工作后如何將數據傳遞回調用線程,但是在這種情況下,通信線程一直在運行。

當然,通信邏輯由單獨的類(CANManager)表示。

我有一些自己的想法,但是我想知道應該怎么做的“正確”方法。

提前致謝 :)

通常,在任何編程語言中,您都需要考慮用於跨線程通信的pub-sub體系結構。 這意味着對於每個希望向線程B發送消息的線程A,您都應該將“消息”或事件從該線程發布到隊列上,以便在空閑時由另一個線程使用。 如果您只是谷歌“ Cross Thread communication c# ”,您會發現許多文章需要閱讀。

具體來說,在.NET中,在另一個(任何)線程上調用方法或委托的方法是使用SynchronizationContext 這對於Windows窗體和WPF都是常見的,而WPF具有Dispatcher,該Dispatcher與該框架不同,只能在UI線程上調用。

有許多框架,庫和模式可用於執行此類技術。 其中之一是任務並行庫 TPL允許您創建一個Task或Task並在線程池,UI,相同或特定線程上調用它。 TPL允許通過使用Scheduler進行線程編組。 您可以使用內置的調度程序,也可以創建自己的調度程序。 調度程序在其心臟處使用SynchronizationContext來進行線程編組。

TPL的一種特別有趣的模式是能夠在一個線程上運行委托,然后在其他線程上鏈接多個操作的能力,例如在完成或出錯時。 我將研究Task Asynchronous Pattern並考慮從異步方法返回Task,以便可以使用ContinueWith鏈接到它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM