Создание интерфейса асинхронной задачи с обратной совместимостью с монодроидом

У меня есть куча интерфейсов для репозитория в основной библиотеке классов, которая определяет возвращаемые типы как Task. Эти интерфейсы используются в других проектах для определения асинхронных методов.

Мне нужно реализовать эти же интерфейсы в проекте монодроида Xamarain, и мне было интересно, как мне использовать те же возвращаемые типы без использования асинхронного ожидания, поскольку это еще не поддерживается в MonoDroid. Я вообще не хочу изменять интерфейсы существующих базовых библиотек, если это возможно.


person MonkeyBonkey    schedule 05.03.2013    source источник
comment
Может быть, взгляните на Microsoft.Bcl, он обеспечивает асинхронность и ожидает, например, WP7. Существует также проект под названием AsyncBridge, реализующий Tasks для PCL, Xamarin.Android и Xamarin.iOS.   -  person Cheesebaron    schedule 05.03.2013


Ответы (1)


Технически вам не обязательно использовать async/await; это намного проще, чем делать это "вручную". Ваши реализации просто должны возвращать Task, которые никогда не бывают null и уже запущены (если применимо).

В документе TAP содержатся некоторые полезные методы и рекомендации. Один тип ключа — TaskCompletionSource<TResult>, который можно использовать для обертывания любой асинхронной реализации (например, APM). Синхронные реализации могут использовать Task.FromResult (это всего лишь небольшая оболочка вокруг TaskCompletionSource. Если у вас есть работа ЦП, вы можете использовать Task.Factory.StartNew, который близко, но не совсем эквивалентно Task.Run. Для более сложных реализаций вам потребуются продолжения а-ля ContinueWith.

Другими словами, можно использовать все методы TPL .NET 4.0, если ваши возвращенные Task всегда запущены. (Единственный способ получить незапущенный Task — создать его с помощью конструктора Task, а не вызывать Start. Так что, пока вы этого не сделаете, все будет в порядке.)

person Stephen Cleary    schedule 05.03.2013