Многопоточный фоновый агент?

#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. Кроме того, я думаю, что ваше сообщение в блоге решило мою другую проблему с загрузкой a BitmapImage в задачу. Спасибо!