Прежде всего, это хороший вопрос. Основываясь на упомянутых вариантах, я думаю, вам нужно сменить ангела.
В вашей текущей реализации область действия UIImage
тесно связана с методом DoSomethingWith
. Другими словами, полученное изображение используется только внутри этого метода. Я вижу два разных пути, как это может развиваться:
- Ввести
DoSomethingElseWith
метод - Избавиться от
DoSomethingWith
и «встроенных» UploadImage
и DisplayResult
В любом случае в вашем блоке using
будет более одного метода. Это будет означать, что очистка UIImage не входит в обязанности методов. В обычных случаях вы бы сделали это, await
добавив последний и позволив блоку using делать свою работу, верно? Если вы не можете дождаться этого, то наиболее очевидным выбором для продолжения является использование ContinueWith
. (Другие: TaskFactory.ContinueWhenAll
, TaskFactory.ContinueWhenAny
, Task.WhenAll
, Task.WhenAny
, для дополнительная информация ).
UIImage image = RetrieveImage();
var uploadJob = UploadImage(image);
var displayJob = uploadJob.ContinueWith((t => DisplayResult(t.Result, image)).Unwrap();
var disposeJob = displayJob.ContinueWith(_ => image.Dispose());
В качестве альтернативы вы можете использовать какой-то короткий механизм сигнализации (син. c примитив), чтобы указать, когда была завершена последняя асинхронная c операция, например AutoResetEvent
, CountdownEvent
, TaskComplitionSource
.
Третий вариант может заключаться в использовании TPL Dataflow . С этим вы можете соединить вместе маленькие части и использовать Завершение , чтобы инициировать удаление в качестве последнего действия.