我正在連接通過IP發送數據的儀器。我想將我的閱讀代碼放入計時器中,以在用戶與程序交互時讀取背景中的數據。我的問題是,它看起來streamreader readline塊。真的嗎?如果是這樣,我應該如何去讀取輸入設備的一條線而不會阻塞?Streamreader - 從IP讀取數據
我還應該注意我的流媒體閱讀器是一個Networkstream。目標框架也是Net 2.0。不知道這是否重要。
TIA, 約翰
我正在連接通過IP發送數據的儀器。我想將我的閱讀代碼放入計時器中,以在用戶與程序交互時讀取背景中的數據。我的問題是,它看起來streamreader readline塊。真的嗎?如果是這樣,我應該如何去讀取輸入設備的一條線而不會阻塞?Streamreader - 從IP讀取數據
我還應該注意我的流媒體閱讀器是一個Networkstream。目標框架也是Net 2.0。不知道這是否重要。
TIA, 約翰
StreamReader.ReadLine
是一個阻塞(同步)方法。當你調用它時,它會阻止執行繼續,直到收到完整的一行。這使得它更容易處理,但顯然,如果你需要它異步工作,它不符合你的需求。
StreamReader
包含其許多方法的阻塞和異步版本。例如,除了ReadLine
方法之外,還有一個ReadLineAsync
方法,其功能與ReadLine
完全相同,但它是異步執行的。
因此,您的選擇是,無論您需要使用其中一種異步方法,還是可以繼續使用ReadLine
方法,即使它是阻塞方法,只要您從另一個線程調用它即可。如果它阻止後臺線程,其唯一目的是讀取流,那對你來說並不重要,只要UI線程沒有被阻塞。因此,例如,你可以有這樣的方法:
Private Sub MonitorStream
While True
ProcessLine(_Reader.ReadLine)
End While
End Sub
然後,你可以調用這個方法在一個新的線程,就像這樣:
Dim t As New Thread(AddressOf MonitorStream)
t.Start()
這只是一個簡單的例子。你可能想要檢查流是否打開,而不是無限循環等。但這應該給你一個起點。我會說,使用ReadLineAsync
方法可能會更好,但對於知道異步編程的人來說,單獨線程中的無限循環更容易處理和理解。
謝謝史蒂夫,這正是我需要理解的。還有一個問題,我沒有看到R eadLineAsynch作爲StreamReader的成員。我在NetworkStream上打開StreamReader。我在VS2008中使用.Net 2.0 - 這是一個問題嗎? – 2013-04-10 19:52:05
嗨史蒂夫 - 你給的這個簡單的例子將會完成這項工作。我感謝你的時間和知識。 – 2013-04-10 20:40:58
還有一個問題,Steve。如果我在線程中使用無限循環,程序關閉時線程是否會關閉?我問,因爲當我運行調試模式並退出VS中的程序時,它仍然處於調試模式,直到我單擊「停止調試」按鈕。對不起,如果這些都是愚蠢的問題,但線程對我來說都是新的。 – 2013-04-10 22:36:11
要麼不使用'ReadLine',要麼從另一個線程調用'ReadLine'。 – 2013-04-10 14:37:35
我不是故意的。我真的很好奇。爲什麼是TIA?我從來沒有理解說「提前致謝」的理由。它總是比任何事情都更粗魯,比如「我已經感謝你了,所以當你真的幫助我時,不要期待感謝」。只有我嗎?把它簡稱爲TIA似乎只是錦上添花。不要誤解我的意思。我假設你根本不打算粗魯,我一直認爲這是一件奇怪的事情。無論如何,在你的問題結束時表示感謝或者說出你的名字是令人不悅的。有關更多詳細信息,請參見[faq]。 – 2013-04-10 14:42:12
點好,謝謝。 – 2013-04-10 14:47:02