#multithreading #windows-phone-7 #background-agents
#многопоточность #windows-phone-7 #фоновые агенты
Вопрос:
Я пишу BackgroundAgent
для своего приложения WP7, которое периодически загружает изображение из Интернета, изменяет его, а затем обновляет им живую плитку. Я обнаружил, что загрузка растрового изображения является асинхронной и требует регистрации ImageOpened
события.
sourceBitmap.ImageOpened = new EventHandler<RoutedEventArgs>((sender, e) => ...
Проблема в том, что это выводит меня из основного потока, который вернется обратно к ScheduledAgent и вызовет NotifyComplete()
до завершения нового потока. Я предполагаю, что это вызовет проблемы и не является идеальным.
Есть ли способ заставить основной поток ждать, пока изображение не будет загружено, отредактировано и помещено на живую плитку?
Или я должен просто использовать поле IsComplete
и Thread.Sleep()
пока оно не станет истинным?
Ответ №1:
Не вызывать Thread.Sleep
.
Вам просто нужно тщательно управлять своими вызовами NotifyComplete
, чтобы убедиться, что вы не вызываете его до завершения загрузки.
Комментарии:
1. Хороший момент. Теперь я понимаю, что даже если исходный поток завершен, если я не вызываю
NotifyComplete
до завершения загрузки / редактирования, все должно быть в порядке (теоретически … не пробовал). К сожалению, я столкнулся с другой несвязанной проблемой, которая заставляет меня пересмотреть свою стратегию для этого (нетBitmapImage
s в фоновых потоках … argh). В любом случае спасибо!
Ответ №2:
Используйте библиотеку параллельных задач. Таким образом, вы можете добавлять продолжения, чтобы заставить задачи ждать ваших асинхронных событий, прежде чем вызывать NotifyComplete() .
Я написал об этом сообщение в блоге.
Короткая часть заключается в использовании a TaskCompletionSource<T>
, чтобы заставить продолжения TPL ждать ImageOpened
события.
Вполне выполнимо.
TPL для Windows Phone можно найти на NuGet.
Комментарии:
1. О, здорово! Звучит похоже на то, что
await
будет в C # 5. Кроме того, я думаю, что ваше сообщение в блоге решило мою другую проблему с загрузкой aBitmapImage
в задачу. Спасибо!