2009-04-09 44 views
1

我有一個奇怪的錯誤,請讓我知道如果你有任何線索的原因。ShowDialog,PropertyGrid和Timer問題

我的主窗體上有一個TimerSystem.Windows.Forms.Timer),它引發了一些更新,最終還會更新主窗體UI。然後我有一個編輯器,它使用ShowDialog()方法從主窗體打開。在這個編輯器中,我有一個PropertyGridSystem.Windows.Forms.PropertyGrid)。

我無法每次重現它,但很多時候,當我在編輯器中使用該屬性網格上的下拉菜單時,它會卡住,也就是確定/取消按鈕不關閉表單,屬性網格變得不可用,關閉表單頭中的按鈕不起作用。

在後臺沒有例外,如果我打破了進程,我發現應用程序正在做一些與我在開頭提到的更新有關的計算。

您能推薦些什麼?任何想法都歡迎。

+0

你有沒有找到這個問題的原因? – roken 2012-04-02 13:07:49

+0

@roken:我忘了:-)我認爲我們使用了一種解決方法,比如在模態對話框處於活動狀態時停止UI刷新定時器... – 2012-04-02 19:22:24

回答

1

發生什麼事是線程計時器的Tick方法不會在不同的線程上執行,所以它會鎖定其他所有內容直到完成。我做了一個試驗的WinForms應用程序,對其有一個計時器和2個按鈕,其事件做:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Thread.Sleep(6000); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    timer1.Start(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    frmShow show = new frmShow(); 
    show.ShowDialog(); // frmShow just has some controls on it to fiddle with 
} 

確實也像你描述的封鎖。以下解決它:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(DoStuff); 
} 

private void DoStuff(object something) 
{ 
    Thread.Sleep(6000); 
}