2013-05-27 35 views
1

在窗體上,通過單擊按鈕啓動長時間運行的任務。該任務在單獨的工作線程上運行,並在任務運行時顯示帶有進度條的另一個表單。爲什麼主窗體消失?

當任務完成或取消時,否則顯示進度條的表單會關閉。虛擬代碼看起來是這樣的:

task.DoWorkAsync(); 
progressBar.Show(parent); 

而當任務完成後

progressBar.Close(); 

但有時在顯示進度條的形式被關閉的那一刻準確,主要形式被切換到後臺。更準確地說,是我必須做的重現該問題:

  • 開始我的應用程序上的另一個窗口
  • 點擊(另一個應用程序的,比方說,Excel)中,以把它前面
  • 點擊我的應用程序窗口(將其帶到前方)
  • 運行

現在的進度條得到了關閉後,我的應用程序窗口背後的另一個我帶到前前(這裏Excel)中消失的任務。

當然我上面描述的是我的應用程序非常粗略的輪廓。但我需要的是在進度條關閉時找出爲什麼我的表單消失。

+0

很奇怪,但活下來的主要形式的線程? –

+1

您正在做某些事情來使主窗口無法訪問。你忘了提到這一點,但這會導致問題。 –

+0

嗨漢斯和福克斯,是的,正確的。我忘了提到這一點。主UI線程保持活動狀態,禁用主窗口以使其無法訪問。我會盡量不要禁用它,然後看看會發生什麼。 – Michael

回答

1

的MainForm

ProgressBar progress = new ProgressBar(this); 
progress.Show(); 
this.Hide(); 

進度

parent.Show(); 
progress.Hide(); 

或者,你可以使用ShowDialog(),這將保持主要形式打開,但inaccessable直到進度條的形式被關閉。

+0

主UI線程繼續處理其他消息,因此無法在此處被阻止。我知道這並不好,但它在5年前以這種方式實施,目前很難清理。 – Michael

0

如果我理解正確,當您關閉顯示進度條的Form時,主要Form會轉到背景?

如果是這樣,您可能需要在顯示進度欄窗體後將焦點返回到主窗體,因爲它偷走了焦點。

這是一個堆棧溢出問題是談論的焦點形式:

Form lost focus - Basic Question

+0

謝謝,但我的感覺是,經常設置形式TopMost = true使事情變得更糟。 – Michael