#c_sharp #net #async_await
Допустим у нас есть класс внутри которого много синхронных методов: public class A { public int Return5() => 5; public string ReturnString() => "string"; } Можно ли создать класс обертку для асинхронизации синхронных методов? Тоесть чтобы на каждый синхронный метод создавался такой же только с возвращаемым типом Task<> и вконце названия метода добавлялось окончание Async. Допустим чтобы это выглядело так: var asyncA = new AsyncClass; var result = await asyncA.ReturnStringAsync();
Ответы
Ответ 1
Технически можно, но это обычно не нужно. Если узкое место у метода — потребление процессора, лучше выставить синхронный интерфейс. Тогда клиенты могут легко запустить задание асинхронно сами: var five = await Task.Run(() => a.Return5()); А могут и не запускать асинхронно, если методу это не нужно. То есть в этом случае просто выставляйте синхронный метод, клиенты сами могут легко превратить его в асинхронный. А вот если же метод не занимает поток для своего выполнения (например, он грузит что-нибудь из интернета, пользуясь async-функциями), тогда нужно выставлять только асинхронный метод. Соответственно вы не сможете выставлять синхронный метод, разве что искусственно создать его через Task.Wait() (что снова-таки не нужно, ведь клиент при желании может сделать это сам). Дополнительное чтение по теме от одного из ключевых разработчиков асинхронных фич C#: Should I expose synchronous wrappers for asynchronous methods? Как технически сделать асинхронную обёртку? Например, через Task.Run: public class AsyncA { private A a = new A(); public TaskReturn5Async() => Task.Run(() => a.Return5()); // и т. д. }
Комментариев нет:
Отправить комментарий