2011-10-24 1 views
0

주기적으로 인터넷에서 이미지를 다운로드하고 수정 한 다음 WPTI 앱으로 라이브 타일을 업데이트하는 WP7 앱에 BackgroundAgent을 쓰고 있습니다. 비트 맵 이미지를로드하는 것이 비동기이며 ImageOpened 이벤트를 등록해야한다는 사실을 발견했습니다.다중 스레드 BackgroundAgent?

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

문제는이 다시 ScheduledAgent로 돌아가 새로운 스레드가 완료되기 전에 NotifyComplete()를 호출 메인 스레드, 떨어져 저를 가져 오는 것입니다. 나는 이것이 문제를 일으키고 이상적이지 않다고 생각한다.

이미지가로드되고 편집되고 라이브 타일로 푸시 될 때까지 주 스레드를 기다리는 방법이 있습니까?

사실이 될 때까지 필드 IsCompleteThread.Sleep()을 사용해야합니까?

답변

0

Task Parallel Library을 사용하십시오. NotifyComplete()를 호출하기 전에 지속성을 추가하여 비동기 이벤트를 기다리는 작업을 강제 할 수 있습니다.

나는 blog post about it을 작성했습니다.

짧은 부분은 ImageOpened 이벤트를 기다리는 동안 TPL 계속을 수행하기 위해 TaskCompletionSource<T>을 사용하는 것입니다.

완벽하게 수행 할 수 있습니다.

Windows Phone 용 TPL은 found on NuGet 일 수 있습니다.

+0

오, 멋지다! C# 5에서 'await'과 비슷한 사운드를 보게됩니다. 또한 블로그 게시물은 작업에서 'BitmapImage'를로드하는 것과 관련된 다른 문제를 해결했다고 생각합니다. 감사! –

1

Thread.Sleep으로 전화하지 마십시오.

다운로드가 완료되기 전에 전화를 걸지 않으려면 NotifyComplete으로 전화를 신중하게 관리하면됩니다.

+0

좋은 지적. 이제는 원본 스레드가 완료 되었더라도 다운로드/편집이 완료되기 전에 NotifyComplete를 호출하지 않는 한 이론적으로는 ... 시도하지 않은 것이 좋습니다. 불행히도 나는 관련없는 또 다른 문제를 겪었는데,이 문제에 대한 나의 전략을 다시 생각하게한다. (BitmapImage는 백그라운드 스레드가 아니다 ...). 어쨌든 고마워! –