Я создал структуру Outcome, чтобы я мог возвращать либо успешный результат, либо сообщение об ошибке из любого метода в моих хранилищах данных (реализация этого не относится к вопросу, кроме конструкторов, которые получают либо TResult
для успеха, либо Exception
для отказа).
Каждый раз, когда я использую это, как и для доступа к базе данных, я запускаю его, используя async
/ await
Таким образом, подпись вызова БД будет выглядеть примерно так: public async Task<Outcome<PersonModel>> GetPerson(PersonID personID);
Я пытался выяснить, могу ли я использовать пользовательский объект типа «Задача» (например, AsyncOutcome<TResult>
) для переноса Outcome<TResult>
без необходимости использования двухуровневых генериков. Например:
public async AsyncOutcome<PersonModel> GetPerson(PersonID personID)
{
try
{
PersonModel model = /* get person from the database */
return new AsyncOutcome<PersonModel>(model);
}
catch (Exception ex)
{
return new AsyncOutcome<PersonModel>(ex);
}
}
public async Task TestAction
{
Outcome<PersonModel> result = await GetPerson(new PersonID(1234));
Console.WriteLine(result.ToString());
}
Однако я пытался обернуть голову вокруг ограниченной документации, касающейся объектов типа «Задача», и AsyncMethodBuilder
, и я просто не могу понять, как это сделать.
Возможно ли это (без переписывания всего конечного автомата и т. Д. c.) Или я скрываюсь ни к чему?
Кто-нибудь делал что-то подобное раньше?