2012-03-06 69 views
2

我有這個窗體窗體,timer1已啓用,它的間隔設置爲2000毫秒。 爲什麼表單每2秒顯示一個消息框?我的意思是,當第一次計時器滴答聲稱UI線程將等待,直到按下確定按鈕,所以如果我不按下按鈕,所以不應該出現另一個消息框。但它看起來!爲什麼?Windows窗體計時器vs單線程應用程序

我知道計時器在它自己的線程上工作,並且計時器在它的間隔上調用timer_tick函數,問題是如何在mbox.show()上阻塞UI線程時顯示另一個消息框?

public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     MessageBox.Show("test"); 
    } 
    } 

回答

3

這是因爲你使用的MessageBox。這是一個模式對話框,用於抽取消息循環。因此,所有正常的Windows通知仍然提供。像油漆事件一樣。它唯一阻止的是用戶輸入通知,鼠標和鍵盤。但是不是一個定時器消息。 Form.ShowDialog()方法也以這種方式工作。

你將不得不自己禁用計時器。

+2

+1有很好的解釋。 – 2012-03-06 12:38:31

2

定時器創建自己的工作線程,它不等待確定按鈕,因爲它做主UI線程。

請嘗試以下操作,它工作嗎? (不能檢查現在後悔)

private void timer1_Tick(object sender, EventArgs e)  
{  
    timer.Stop(); 
    MessageBox.Show("test");  
    timer.Start(); 
} 

編輯:回答在評論

的問題,所以如果主UI線程停在mbox.Show()爲什麼另一個消息框 顯示?

this SO post

MessageBox.Show將顯示它的線程從呼籲UI。如果 尚不是線程上運行的消息泵,則它將設置爲臨時性的 以便運行。在 顯示通話結束

+0

所以如果主UI線程停在mbox.Show()爲什麼另一個消息框顯示? – HPT 2012-03-06 12:20:53

+0

查看更新(編輯部分) – sll 2012-03-06 12:52:28

0

定時器工作在它自己的線程不在UI線程所以它不會被消息框對話後,它會撕裂下來。

您可以使用反射器來看看它是如何工作的。

+0

我知道計時器在它自己的線程上工作,並且計時器在它的間隔上調用timer_tick函數,問題是當在mbox.show()上阻塞UI線程時如何顯示另一個消息框? – HPT 2012-03-06 12:23:50

0

您需要停止計時器顯示的消息框時,當對話框關閉重啓:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    this.timer.Stop(); 
    DialogResult result = MessageBox.Show("test"); 
    if (result == DialogResult.OK) 
    { 
     this.timer.Start(); 
    } 
}