Страницы

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

воскресенье, 21 октября 2018 г.

Можно ли создать класс-обертку для асинхронизации методов?

Допустим у нас есть класс внутри которого много синхронных методов:
public class A { public int Return5() => 5;
public string ReturnString() => "string"; }
Можно ли создать класс обертку для асинхронизации синхронных методов? Тоесть чтобы на каждый синхронный метод создавался такой же только с возвращаемым типом Task<> и вконце названия метода добавлялось окончание Async. Допустим чтобы это выглядело так:
var asyncA = new AsyncClass;
var result = await asyncA.ReturnStringAsync();


Ответ

Технически можно, но это обычно не нужно.
Если узкое место у метода — потребление процессора, лучше выставить синхронный интерфейс. Тогда клиенты могут легко запустить задание асинхронно сами:
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 Task Return5Async() => Task.Run(() => a.Return5()); // и т. д. }

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

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