2011-07-27 53 views
0

我有一個帶有標籤和進度條的WPF窗體。一旦表單被加載,下載從遠程服務器開始,但表單凍結並且不能正確呈現。在我上一篇文章中,有人建議我使用FileAsync來下載文件,但我正在使用第三方FTP庫。這個庫有DownloadFileAsync方法,但仍然存在Form凍結問題。具有Notifer類的WPF窗體上的綁定控件

我也創建了這樣的DoEvents函數,但它也不會阻止凍結界面。

private void DoEvents() 
{ 
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, 
                new Action(delegate { })); 
} 

我正在計劃使用INotify類型的東西的另一種方法。讓我告訴你我計劃要做的步驟:

(1)將下載文件方法移到另一個類,例如DownloaderClass。

(2)當MainWindow加載時,創建一個單獨的線程並調用Downloader類中的Download方法。

(3)創建另一個類,例如NotifierClass,作爲靜態類。這個類包含以下屬性:

DownloadedBytes

CurrentFileName

(4)的DownloadFile在DownloaderClass方法,不斷更新NotifierClass的屬性。

我想在Notifer Class中使用這些屬性連接MainWindow上的ProgressBar和幾個Label控件,以使它們更新。

這種方法行得通嗎?如何使NotifierClass將狀態更新發送到MainWindow?

我正在使用VS-2010 Express。

回答

1

跳過Notifier類並將屬性放在Download類中。確保下載類實現INotifyPropertyChanged。

在您的下載方法中,您可以使用BackgroundWorker執行您的代碼。如果使用Backgroundworkers ReportProgress方法和事件調用,則可以隨時更新%完成屬性,甚至可以在完成時在UI線程上執行代碼。

然後,您只需將您的下載類綁定到WPF表單。