Какъв е препоръчителният начин за добавяне на постусловия към асинхронни методи, които връщат Task<T>
?
Прочетох следното предложение:
http://social.msdn.microsoft.com/Forums/hu-HU/async/thread/52fc521c-473e-4bb2-a666-6c97a4dd3a39
Публикацията предлага прилагането на всеки метод като синхронен, свиването му и след това прилагането на асинхронен аналог като проста обвивка. За съжаление не виждам това като работещо решение (може би поради собственото ми неразбиране):
- Методът async, въпреки че се предполага, че е обвивка за метода за синхронизиране, е оставен без реален договор за код и следователно може да прави каквото си иска.
- Кодовите бази, които са ангажирани с асинхронност, е малко вероятно да внедрят синхронизиращи двойници за всичко. В резултат на това внедряването на нови методи, които съдържат
await
s върху други асинхронни методи, следователно са принудени да бъдат асинхронни. Тези методи са вътрешно асинхронни и не могат лесно да бъдат преобразувани в синхронни. Те не са просто опаковки.
Дори ако обезсилихме последната точка, като казахме, че можем да използваме .Result
или .Wait()
вместо await
(което всъщност би довело до блокиране на някои SyncContext
s и така или иначе ще трябва да бъдат пренаписани в async метода), аз все още съм убеден за първа точка.
Има ли някакви алтернативни идеи или има нещо, което съм пропуснал относно кодовите договори и TPL?