Страницы

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

суббота, 14 декабря 2019 г.

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

#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 Task Return5Async() => Task.Run(() => a.Return5()); // и т. д. }

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

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