2009-11-13 67 views
1

我正在處理用戶選擇大文件後。我的代碼如下所示:Silverlight OpenFileDialog等效DoEvents

if (FileDialog.ShowDialog() == true) { 
    // process really big file 
} 

這凍結了UI,所以我想首先顯示加載消息的用戶選擇的文件給他們一個視覺線索的東西正在發生前:

loadingMessage.Visibility = Visibility.Visible; 
if (FileDialog.ShowDialog() == true) { 
    // process really big file 
} 

不幸的是,當文件正在處理時,這仍然完全凍結了用戶界面。

我發現完美的作品是如果我在文件選擇後立即激活MessageBox。我認爲它在底層做了一個「DoEvents」類型的調用,以在運行時獲得flush事件/ ui項。

loadingMessage.Visibility = Visibility.Visible; 
if (FileDialog.ShowDialog() == true) { 
    MessageBox.Show("Sync!"); 
    // process really big file 
} 

在這樣的大文件仍在處理爲慢,但顯示的加載信息,並且屏幕UI被同步的了(我在做真實的東西一些其他的東西,如顯示等待光標案例)。

問:

Silverlight有沒有的DoEvents功能。除了MessageBox.Show之外,是否還有一個調用可以實現同步UI和防止OpenFileDialog凍結UI的效果?

回答

1

使用BackgroundWorker在後臺執行繁重的計算。當您想要通知UI該操作已完成時,可以使用上述類的RunWorkerCompleted事件。另一種方法是使用完全獨立的線程,然後使用Dispatcher.BeginInvoke()回調UI線程。請記住,在獨立的線程中,如果沒有這種同步,就無法訪​​問任何GUI組件。