Async Func в качестве делегата - PullRequest
0 голосов
/ 03 января 2019

Предположим, у меня есть функция, которая преобразует некоторые входные данные в некоторые выходные данные:

TypeB MyFunction(TypeA input);

У меня есть несколько очень похожих функций, за исключением MyFunction, все они имеют следующий шаблон:

int Example1(...)
{
     TypeA a = X();
     TypeB b = MyFunction(a);
     int z = Z(x, y);
     return z;
}

Единственная разница - это MyFunction. X и Z на самом деле не являются функциями, это операторы LINQ, которые возвращают анонимные типы, поэтому я решил создать одну функцию с параметром MyFunction:

int Example2(Func<TypeA, TypeB> MyFunction)
{
     TypeA a = X();
     TypeB b = MyFunction(a);
     int z = Z(x, y);
     return z;
}

Так что теперь есть только одно место, где я использую последовательность A - MyFunction - C. Если в будущем A изменится на что-то другое, все пользователи Example2 автоматически получат этот новый A.

Использование (для простоты: typeA и typeB - это int):

int B1 (int a) {...}
int B2 (int a) {...}

int i = Example2(B1);
int j = Example2(B2);

Это отлично работает. Но теперь у меня есть версия, где MyFunction является асинхронной

Task<int> B1Async(int a) {...}

Можно ли создать делегата для B1Async, чтобы я все еще мог использовать Example1,

async Task<int> DoItAsync
{
    // create a delegate for B1Async:
    Func<int, int> B1AsyncDelegate = ...

    // call Example1:
    ???
}

или мне нужно создать асинхронную версию

...