Pages

2009-09-09

破壞If規則的例子

程式目的是接收RS232傳來的資料寫入一個檔案,
因此畫面上就是按Listen時開檔,按Stop時關檔,並設為null。
SNAGHTML3ce3fb2
當我關檔成功時,其FileStream也確定是null,5秒後,再RS232又有資料來
理論上應該會被下圖的if {}給略過,但卻仍發生錯誤。
SNAGHTML3c7fd55
VS2008畫面說fileStream.Write()因為是null,不能執行,檢查了fileStream值的確是null值
但它卻闖入了!!

雖然這整個method是非同步執行的,但我的確等了足足5秒後再傳資料來
就算是不同的thread,也足夠時間同步這global變數fileStream的狀態吧?!

這真的是很奇怪的現象… 有人能解釋嗎?

1 comment:

tomexou said...

經過Calvin Wang的指導,發現即使是主UI Thread下的FileStream,只要跨執行緒讀取通用變數也十分危險,因此使用Invoke()方式讓寫檔動作移至UI Thread執行就okay了。

太久沒寫跨執行緒程序,很多細節沒注意,才會被惡搞成這樣。至於VS2008 Debug會這樣怪現象,是因為對跨執行緒的偵測並不是那麼精準所致。