Допустим у нас есть класс внутри которого много синхронных методов:
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
Комментариев нет:
Отправить комментарий