2013-06-18 110 views
0

我正在研究通過串行端口與數字萬用表接口的C#Windows窗體應用程序。在我的BackgroundWorker的事件處理程序中,我向萬用表發送了幾個命令,例如進行電壓/電阻測量,然後請求回數據。然後,串口的DataReceived事件被提出,並且我在那個方法中做了一些簡單的處理;我使用ReadLine()並將數據存儲在一個字符串中。但我認爲因爲DoWorkDataReceived是異步的,所以如果我試圖在請求數據的語句之後立即使用DoWork中的那個字符串,我不會得到正確的值;我必須等待DataReceived完成。目前,我在每個這樣的陳述後都只有一個Thread.Sleep(100)。我相信這不是最好的解決方案,有沒有更高效的方式來等待DataReceived完成或以其他方式處理此線程問題?如何等待BackgroundWorker中的SerialPort DataReceived事件處理程序

+1

如果您需要工作線程中的數據,那麼使用DataReceived沒有意義。只需直接調用其中一個Read方法即可。它會阻塞,直到數據可用。你不關心它阻塞,它不是UI線程,並且不會凍結你的用戶界面。 –

回答

0

根本不應該使用後臺工作者,因爲您有異步工作而不是同步工作。相反,只需發送請求並完全在事件處理程序中完成需要完成的任何響應。

+0

我不明白。數據請求本身是引發DataReceived的原因。我不能把它放在那個事件的處理程序中。也不是意圖用於異步操作的後臺工作者嗎?我在後臺做了很多萬用表的工作。 – user2498300

+0

@ user2498300發送請求時,DataReceived事件不會立即觸發。如果你立刻得到了結果,它將只是你調用的方法的返回值。發生事件的全部原因是因爲發送請求和收到響應之間會有一段時間。您需要在'DataRecieved'事件處理程序中完成您的工作。這是解決這個問題的適當方法。不,BGW不是爲了解僱異步工作而設計的。它被設計爲在UI線程之外進行同步工作並執行它,使其成爲異步。 – Servy

+0

我明白你的意思了,我誤解了你最初的迴應。現在我的問題是,我需要在不同的時間點對請求的數據執行不同的操作,而且我沒有看到如何在DataReceived事件處理程序中單獨處理它。有時我將數據存儲在各種陣列中,在其他時候我正在增加和減少以調整萬用表的輸入等。 – user2498300

相關問題