[英]C# multiple threads and serial communication
今天,我遇到了一些奇怪的行為。 我有一個使用SerialPort
類訪問的串行設備。 主應用程序具有一些計時器,該計時器每秒輪詢一次設備以獲取某些狀態更新。 在某個時候,我需要做一些耗時的工作,因此,我使用Backgroundworker
不會阻塞GUI。 后台工作人員只需訪問一次即可訪問同一串行設備。 有時訪問有時無效。 經典的mutli-thread
方案。 因此,我嘗試在將新命令發送到串行設備的函數上使用Mutex。
對於串行設備,我將所有內容放到了自己的類中。 在此類中,我具有sendCommand()
函數,該函數將命令寫入設備,並使用AutoResetEvent
和OnDataReceived
Event等待答案。 sendCommand函數將一直阻塞,直到收到答案或超時為止。 然后,我在所有可能的出口上輸入sendCommand和releaseMutex
時添加了Mutex
。 仍然無法正常工作。
有沒有更好的方法來解決這個問題?
謝謝托比亞斯
我有一個應用程序執行的操作完全相同-我所做的是創建了一個串行訪問類,並且無論何時(從GUI或我的一個后台線程)調用它,我都將擁有以下內容:
private void myFunction(SerialClass myserialobject) {
if (myserialobject == null)
return;
lock (myserialobject) {
// code accessing the serial object
// ...
// when finished, close the lock statement
}
}
我在主線程和其他任何需要訪問的線程中都使用了它。 它正在阻止,但我認為這是一個阻止聲明。
另外,我沒有對OnDataReceived
事件使用事件處理程序, OnDataReceived
讓我的串行對象在寫入后執行阻塞讀取,這樣可以防止在錯誤的上下文中接收任何數據。 我不確定您的程序的設置如何精確,但是您可能要考慮這樣做。 如果您知道在寫入端口時希望讀取的字節數,則效果最佳。 這樣,您就不必使用Sleep
來確保已讀取所有數據。
我通常要做的是循環運行串行讀/寫線程,並通過定時等待從BlockingQueue中讀取命令。 如果在超時時間內接收到串行請求對象,則線程將執行該對象;如果等待超時,則該線程將執行對串行設備的輪詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.