2014-10-17 125 views
0

我被困在使用正確的後臺工作,應用程序需要與數據庫進行通信,所以它需要更長的時間和UI凍結了一段時間,我需要創建一個函數執行數據庫事情,並等待工作完成,此時,我想顯示一種通知用戶有關應用程序狀態(加載,忙碌,下載)的窗口。在WPF應用程序中正確使用後臺工作

我的代碼

我沒有寫任何代碼還沒有,但我這裏還有我需要什麼:

//instructions 
InitializeComponent(); 

//do this in background and wait until it finnishes 
GetEntitiesFromDatabase(); 

entitiesListView.ItemSource = someList; (GetEntitiesFromDatabase will initialize this list) 
//.... 

我如何可以繼續,我知道這個問題可能已經問在論壇上,但我絕望尋找答案,如果這可以做其他方式請幫助我,在此先感謝。

+2

您是否閱讀過'BackgroundWorker'或更新的技術文檔,比如'Task,async/await'異步執行長時間運行的操作? – 2014-10-17 18:42:00

+1

「我還沒有寫任何代碼」 - 恕我直言,你應該在發佈問題之前。在你尋找其他人爲你解決問題之前,你至少應該想出一些有用的東西。 :p – 2014-10-17 18:55:08

+0

hi @HamletHakobyan,我聽說過assync/await的事情,你能鏈接好的話題嗎? – Redaa 2014-10-17 18:55:25

回答

2

如果您要直接操作用戶界面,那麼當您不在UI線程(請參閱BackgroundWorker)時,您需要使用Dispatcher.BeginInvoke

Dispatcher.BeginInvoke(new Action(() => 
{ 
    entitiesListView.ItemSource = someList; 
}), null); 

你也可以綁定的項目源到您的視圖模型(一個更好的主意)和框架將元帥的變化到綁定屬性爲您服務。

基本上,使用Dispatcher.BeginInvoke或切換到MVVM(WPF本來打算使用)。

+0

感謝您的回答,我的用戶dispatcher.beginInvoke,但它不工作,不知道你的語法壽: 'ProductsListView.Dispatcher.BeginInvoke(新的行動(()=> { 如果 (allProducts = null) ProductsListView。ItemsSource = allProducts; }));' 我用過這個,但調度程序不更新listview項源 – Redaa 2014-10-17 18:58:36

+0

@User1只要你沒有得到一個跨線程異常;它確實如此。檢查你的變量,看看它的設置。我修正了語法,謝謝你注意到這個錯誤。 – BradleyDotNET 2014-10-17 19:01:51

相關問題