C#裡面MessageBox不能亂用,阻塞和非阻塞,模態對話方塊和非模態
阿新 • • 發佈:2018-12-12
我一開始以為這個MessageBox跟Delphi裡面的ShowMessage是一樣的,程式裡可以隨便放,因為C#裡面就TM這一個封裝好的彈出對話方塊提示訊息函式,可以直接用的。
結果實習做程式測試被坑爹了,發現我錯了,C#這個MessageBox預設是模態對話方塊,是阻塞的,也就是說你不區點選okNOCancel他一直顯示在那裡程式裡後面的程式碼是停止的不往後執行,但是主程式仍然會響應其他訊息,比如Timer事件,造成時序邏輯混亂。
原來隨手寫的是這樣:
private void ReadOTPDataHandle() { if (xxxxxx) //若命令字和地址都正確 { xxxxxxxxxxxx; } else { MessageBox.Show("ERROR: communication data verify error!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); cmdptr = 0; mode = 4; comok = 100; Btype = Type.Bu_no_type; } }
</pre><p></p><pre>
正確的寫法應該是把MessageBox放在程式段的最後,這樣:
private void ReadOTPDataHandle() { if (xxxxxx) //若命令字和地址都正確 { xxxxxxxxxxxx; } else { cmdptr = 0; mode = 4; comok = 100; Btype = Type.Bu_no_type; MessageBox.Show("ERROR: communication data verify error!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
-------------
但是最後,那如果是普通的MessageBox.Show("asdfadsfasdf!"),這種不帶圖示和YesNo返回的,有沒有問題呢?是不是就跟Delphi裡面的ShowMessage一樣了非模態可以任意彈出不用去處理?