我正在研究通過串行端口與數字萬用表接口的C#Windows窗體應用程序。在我的BackgroundWorker的事件處理程序中,我向萬用表發送了幾個命令,例如進行電壓/電阻測量,然後請求回數據。然後,串口的DataReceived
事件被提出,並且我在那個方法中做了一些簡單的處理;我使用ReadLine()
並將數據存儲在一個字符串中。但我認爲因爲DoWork
和DataReceived
是異步的,所以如果我試圖在請求數據的語句之後立即使用DoWork
中的那個字符串,我不會得到正確的值;我必須等待DataReceived
完成。目前,我在每個這樣的陳述後都只有一個Thread.Sleep(100)
。我相信這不是最好的解決方案,有沒有更高效的方式來等待DataReceived
完成或以其他方式處理此線程問題?如何等待BackgroundWorker中的SerialPort DataReceived事件處理程序
回答
根本不應該使用後臺工作者,因爲您有異步工作而不是同步工作。相反,只需發送請求並完全在事件處理程序中完成需要完成的任何響應。
我不明白。數據請求本身是引發DataReceived的原因。我不能把它放在那個事件的處理程序中。也不是意圖用於異步操作的後臺工作者嗎?我在後臺做了很多萬用表的工作。 – user2498300
@ user2498300發送請求時,DataReceived事件不會立即觸發。如果你立刻得到了結果,它將只是你調用的方法的返回值。發生事件的全部原因是因爲發送請求和收到響應之間會有一段時間。您需要在'DataRecieved'事件處理程序中完成您的工作。這是解決這個問題的適當方法。不,BGW不是爲了解僱異步工作而設計的。它被設計爲在UI線程之外進行同步工作並執行它,使其成爲異步。 – Servy
我明白你的意思了,我誤解了你最初的迴應。現在我的問題是,我需要在不同的時間點對請求的數據執行不同的操作,而且我沒有看到如何在DataReceived事件處理程序中單獨處理它。有時我將數據存儲在各種陣列中,在其他時候我正在增加和減少以調整萬用表的輸入等。 – user2498300
- 1. .Net SerialPort Readline與DataReceived事件處理程序
- 2. BackgroundWorker事件處理程序
- 3. 等待事件處理程序異步
- 4. 如何等待骨幹中的所有事件處理程序?
- 5. DataReceived未收到消息的事件處理程序
- 6. 閉包和BackgroundWorker事件處理程序
- 7. .NET SerialPort DataReceived事件未觸發
- 8. 如何使用DataReceived事件在.Net中使用SerialPort?
- 9. 如何使用處理程序等待?
- 10. c#SerialPort PinChanged事件處理
- 11. 如何等待BackgroundWorker完成?
- 12. DataReceived事件檢索處理程序的串行C#
- 13. 等待JavaFX應用程序線程完成處理事件?
- 14. 等待來自事件處理程序的某些數據
- 15. 等待要處理的事件
- 16. AsyncEx DeferralManager用於等待事件處理程序
- 17. 阻止代碼並等待事件處理程序觸發?
- 18. 在Dispose中等待Backgroundworker()
- 19. SerialPort等待響應
- 20. 等待BackgroundWorker完成?
- 21. 使用backgroundworker和事件處理程序的多線程
- 22. 繼續處理之前等待事件
- 23. C#.NET 3.5:如何調用事件處理程序並等待它完成
- 24. 哪個線程做backgroundworker完成事件處理程序運行?
- 25. 如何等待BackgroundWorker的完成?
- 26. C#SerialPort DataReceived不更新主UI的事件
- 27. 的SerialPort單聲道在linux不響應DataReceived事件檢索
- 28. serialport dataReceived事件和線程問題導致凍結C#中的窗體#
- 29. Actionscript 3:強制程序等待,直到事件處理程序被調用
- 30. 如何中斷事件處理程序
如果您需要工作線程中的數據,那麼使用DataReceived沒有意義。只需直接調用其中一個Read方法即可。它會阻塞,直到數據可用。你不關心它阻塞,它不是UI線程,並且不會凍結你的用戶界面。 –