簡體   English   中英

WPF,C#,串行端口通信

[英]WPF, C#, Serial Port Communication

我正在使用串行端口通信,有一個串行端口的DataReceived事件,其中如果接收到的數據的頁眉和頁腳匹配,我正在執行2個復雜而冗長的函數,這里我使用了循環緩沖區進行數據接收,

在這兩個函數中,第一個函數在Canvas上更新2058字節的圖形(面積圖),第二個函數對2058字節進行一些復雜的計算。 我每3秒就會收到這2058個字節。

所以我的要求是,當我在另一側將數據填充到緩沖區中時,我需要對緩沖區中已有的數據執行這兩個功能(因為它是循環緩沖區,它包含先前填充的數據)。

我在這里有點困惑,如何實現這種並發。 我知道一些方法

  1. 使用“任務”
  2. 使用“線程”
  3. 使用“異步並等待”
  4. 使用“任務並行庫”
  5. 使用“后台工作者”
  6. 使用'Dispatcher.Invoke()'

當前,我正在使用Dispatcher.Invoke() ,它花費太多時間進行UI更新。 因此,這里會發生時滯。

請建議我哪種方法會更靈敏。

從要完成的工作量來看,由於每三秒鍾就會發生一次,因此我認為線程池上的任務和排隊工作是您最好的解決方案。

我不建議產生一個新的專用線程。

根據此過程需要多長時間和您的配置,我認為您可以考慮讓少量永久線程循環運行並查詢新接收的數據隊列以進行處理(即創建自己的線程池)。 這可以使用ConcurrentQueue來發布和接收數據來完成。 另外,您還可以考慮考慮TPL.Dataflow ,它可以在多線程環境中要求低延遲和高性能的情況下提供極大幫助。 無論采用哪種解決方案,都可以從Dataflow中研究BufferBlock類中受益。

您可以將1-5用於復雜的工作(因為這種情況適用於此情況)。 您可以使用6將結果注入到圖形中,因為Dispatcher.Invoke的目的是在UI-Thread中處理工作,並且對於大多數控件都是必需的。

希望對您有所幫助。

我已經通過計時器和后台工作人員同步成功管理了它。

我注意到的唯一重要的事情是您需要一個好的處理器,至少是'core-i3'。

SKleanthous先生提出的解決方案也是可以接受的。 謝謝。

謝謝安德烈亞斯·穆勒先生,是的,我明白你的意思。

非常感謝大家。

暫無
暫無

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

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