2012-04-24 117 views
1

有沒有辦法做這樣的事情?Silverlight觸發一個事件,然後再觸發另一個事件

背景: 我點了一個按鈕。點擊按鈕時,我嘗試顯示「加載」消息,運行一些執行一些UI工作的代碼,然後解除「加載」消息。通常需要幾秒到20秒的時間。目前加載消息根本不顯示,並且UI凍結,直到完成按鈕點擊中的代碼。

我已閱讀關於Background Worker和調度程序,但一直未能得到它的工作。我不確定是否因爲按鈕點擊中的代碼調用了各種其他代碼(包括第三方的東西),但是我無法使其正確運行。這一切仍然有效,但它仍凍結了用戶界面,並且不顯示加載消息。

所以,我想知道是否有另一種解決方法。是否可以進行設置,以便在按鈕上單擊我只顯示加載消息,然後稍後再啓動另一個執行我長時間運行的進程的事件?這樣用戶界面仍然會凍結幾秒鐘,但至少會顯示「加載」消息。

+0

使用BackgroundWorker和你的問題都將解決沒有UI凍結。你遇到了什麼問題? BackgroundWorker的重要技巧是在調用UI元素上的方法時,必須使用Dispatcher.Invoke()。 – 2012-04-24 22:50:01

+0

我不太確定。我使用了BackgroundWorker和Dispatcher,應用程序按照通常的方式工作,包括點擊按鈕後仍凍結整個應用程序。這個問題甚至可能不是線程或UI相關的。也許這個過程需要很長時間才能完成。當發生這種情況時,我看到我的CPU達到了50%,這通常不會發生,除非發生了一些大事。 – dtc 2012-04-24 23:58:19

+0

聽起來像對圖表元素本身的調用很慢。 System.Threading.Timer是你正在尋找的。 – 2012-04-25 00:31:12

回答

1

您應該可以通過撥打Dispatcher.BeginInvoke來完成此操作。

private void ButtonClick(object sender, EventArgs e) 
{ 
    ShowMyLoadingMessage(); // your code, not sure what it is 
    Dispatcher.BeginInvoke(() => 
    { 
     CallMyLongRunningCode(); // again, not sure what this is 
     HideMyLoadingMessage(); 
    } 
} 

我不認爲這是最好的解決方案,因爲它在UI線程上運行,但它應該做你所要求的。

什麼是長時間運行的代碼需要20秒?

+0

此代碼運行正常,但不會緩解問題。當我點擊確定按鈕時,它仍會凍結整個應用程序,直到過程完成,並且我的加載指示符也不會顯示出來。長時間運行的代碼使用第三方庫從數據創建圖表。 – dtc 2012-04-25 00:04:51

+0

是的,當你描述這個問題時,我很害怕。長時間運行的代碼是獲取圖表的數據還是隻是建立圖表? – Bryant 2012-04-25 00:23:24

+0

它使用已從數據庫中檢索的數據。然後根據數據構建圖表。據我所知,它可以根據它的數據從頭開始構建圖表。但是,之後的代碼我並不太熟悉,這就是爲什麼我正在尋找一個更快的解決方案,以便在屏幕凍結時至少顯示加載指示符。 – dtc 2012-04-25 00:29:08