Подтвердить что ты не робот

Как реализовать метод делегирования асинхронных действий?

Немного справочной информации.

Я изучаю стек Web API, и я пытаюсь инкапсулировать все данные в форме объекта Result с такими параметрами, как Success и ErrorCodes.

Различные методы, однако, приведут к разным результатам и кодам ошибок, но объект результата, как правило, будет создан таким же образом.

Чтобы сэкономить время, а также узнать больше о возможностях async/await в С#, я пытаюсь обернуть все тела методов моих действий веб-api в асинхронном делете делегирования, но попал в ловушку..

Для следующих классов:

public class Result
{
    public bool Success { get; set; }
    public List<int> ErrorCodes{ get; set; }
}

public async Task<Result> GetResultAsync()
{
    return await DoSomethingAsync<Result>(result =>
    {
        // Do something here
        result.Success = true;

        if (SomethingIsTrue)
        {
            result.ErrorCodes.Add(404);
            result.Success = false;
        }
    }
}

Я хочу написать метод, который выполняет действие над объектом Result и возвращает его. Обычно с помощью синхронных методов было бы

public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    T result = new T();
    resultBody(result);
    return result;
}

Но как преобразовать этот метод в асинхронный метод, используя async/wait?

Вот что я пробовал:

public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody) 
    where T: Result, new()
{
    // But I don't know what do do from here.
    // What do I await?
}
4b9b3361

Ответ 1

async эквивалент Action<T> равен Func<T, Task>, поэтому я считаю, что это то, что вы ищете:

public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody)
    where T : Result, new()
{
  T result = new T();
  await resultBody(result);
  return result;
}

Ответ 2

Поэтому я считаю, что способ реализовать это:

public Task<T> DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    return Task<T>.Factory.StartNew(() =>
    {
        T result = new T();
        resultBody(result);
        return result;
    });
}