Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

c# await class.methodAsync1().methodAsync2()

#c_sharp #async_await


Возможно ли использовать асинхронные методы в цепочке?

var blog = new Blog();
await blog.ValidateAsync().InsertAsync().SaveAsync();

    


Ответы

Ответ 1



Нет. Все асинхронные методы возвращают Task, а чтобы добраться до результата таска, нужно дописать ключевое слово await. Поскольку второй метод вам нужно вызвать у результата первого таска, то нужно сперва дождаться этого таска. И так далее. Получится следующая вложенная цепочка: await (await (await blog.ValidateAsync()).InsertAsync()).SaveAsync(); Можно оформить это костылями с использованием методов расширения, где InsertAsync() будет являться методом расширения для некоего Task, где T содержит все необходимое для работы метода. Аналогично и с SaveAsync(). И остальные ожидания будут происходить уже внутри этих методов. Однако в вашем случае не советовал бы так делать. Fluent-синтаксис хорошо в весьма определенных сценариях, а цепочка "валидация - вставка - сохранение", на мой взгляд, в них не входит. Лучше всего вызывать эти методы последовательно, не экономить на строчках и не стремиться к "красоте".

Ответ 2



В такой цепочке - нет, нельзя. Можно написать разве что вот так: await (await (await blog.ValidateAsync()).InsertAsync()).SaveAsync(); Но лучше все-таки явно разделять разные операции: await blog.ValidateAsync(); await blog.InsertAsync(); await blog.SaveAsync();

Комментариев нет:

Отправить комментарий