2011-10-24 34 views
0

我正在爲我的WP7應用程序編寫一個BackgroundAgent,該應用程序會定期從互聯網下載圖像,對其進行修改,然後使用它更新實時圖塊。我發現加載位圖圖像是異步的,並且需要註冊ImageOpened事件。多線程BackgroundAgent?

sourceBitmap.ImageOpened += new EventHandler<RoutedEventArgs>((sender, e) => ... 

的問題是,這給我帶來過主線程,這將返回到ScheduledAgent並調用NotifyComplete()新的線程完成之前。我認爲這會造成問題,並不理想。

有沒有辦法讓主線程等待圖像加載,編輯並推送到活動切片?

或者我應該只使用字段IsCompleteThread.Sleep(),直到它是真實的?

回答

0

使用Task Parallel Library。這樣,在調用NotifyComplete()之前,您可以添加延續,強制任務等待異步事件。我已經寫了blog post about it

短的部分是使用TaskCompletionSource<T>,使TPL繼續等待ImageOpened事件。

完美可行。

TPL for Windows Phone,可以是found on NuGet

+0

哦,真好!聽起來類似於C#5中的「await」。另外,我認爲你的博客帖子解決了我在加載任務中的「BitmapImage」時遇到的其他問題。謝謝! –

1

不要撥打Thread.Sleep

你只需要仔細管理你的電話NotifyComplete,以確保在下載完成之前不需要調用它。

+0

好點。我現在意識到,即使原始線程完成,只要我在下載/編輯完成之前不調用'NotifyComplete',它應該沒問題(理論上......沒有嘗試過)。不幸的是,我遇到了另一個無關的問題,這讓我重新思考我的策略(在後臺線程上沒有'BitmapImage' ... argh)。不管怎麼說,還是要謝謝你! –