2011-12-11 76 views
0

我有一個運行大量代碼的頁面,爲用戶準備頁面和頁面佈局。如何在執行代碼時運行加載器動畫?

它只需要在藍色月亮中使用一次。但是當它發生時,大約需要等待用戶三秒鐘。

顯然,微軟只允許等待2秒或更少。 Daaaaang。

我已經對代碼進行了優化和優化,沒有辦法繞開代碼:代碼儘可能快。自然,我着手製作一個裝載機。

我試圖更新幾個控件,但由於UI線程被凍結,他們沒有工作。

我搜索,搜索和搜索,發現this,這是混亂,並沒有真正的幫助,部分原因是WP7的C#版本,部分原因是我在C#初學者。

如何在UI線程凍結時製作裝載程序?

回答

2

Silverlight Toolkit For Windows Phone引入了PerformanceProgressBar,「described in this WindowsPhone Geek article」將專門用於動畫的合成器線程替代UI(用戶界面)線程「。這應該可以幫助你處理凍結的用戶界面。由於並行執行(由Merlyn建議),我建議QueueUserWorkItem方法在BackgroundWorker之上的單獨線程中執行代碼,從而使UI線程在UI更新中處於活動狀態,但正如文章中所述,您將需要使用Dispatcher.BeginInvoke從那裏更新您的用戶界面。

+1

謝謝!我終於有了一個進度條,即使它在模擬器上顯示得稍慢一點,也不會顯示%完成的情況。另外,我將您的代表提升到了4位數區域! – JavaAndCSharp

1

您可以嘗試使用the BackgroundWorker class。該頁面有一個關於如何使用它的教程。

看到這個問題和我的答案爲另一個教程。雖然不是Windows Phone 7的具體的,它仍然有做更新UI在等待任務完成:

下面是使用BackgroundWorker了Windows Phone 7的具體教程:

+0

我嘗試了幾次,有幾種不同的配置,總是得到某種錯誤或其他。當使用MSDN頁面和以前的答案中的一些代碼時,我收到一條消息:「System.UnauthorizedAccessException未處理」和「無效的跨線程訪問」。幸運的是,我能夠用托馬斯的回答來拯救某種裝載機。不管怎麼說,還是要謝謝你;你的回答讓我開始思考BackgroundWorker的世界。 – JavaAndCSharp

+1

@JavaAndCSharp:您試圖在後臺線程中更新UI。您需要使用「Dispatcher」類將更新發布到您的UI。請參閱:http://stackoverflow.com/questions/1924408/invalid-cross-thread-access-issue –

+1

@JavaAndCSharp:'BackgroundWorker'優於其他選項的優點是,如果您有一個長時間運行的任務,並且您想要支持取消,它已經有一個內置的機制。請參閱:http:// stackoverflow。com/questions/7731610/cancel-threadpool-queueuserworkitem-task - 如果你使用'QueueUserWorkItem',你可以從這個問題中看到你必須「自己動手」取消取消。如果你的任務沒有那麼長時間,並且你永遠不想取消它,那麼不要擔心它:) –