Неудачный метод asyn c без создания исключения - PullRequest
1 голос
/ 12 июля 2020

Предположим, у меня есть следующий метод и код, который его вызывает:

public async Task<MyResult> PerformAction(string parameter)
{
   if(parameter == "fail")
      throw new Exception("You wanted me to fail.");
   return await MyResult.Create(parameter);
}

var resultOne = await PerformAction("fail");
var resultTwo = await PerformAction("success");

Это будет работать нормально, но вызовет исключение, что приведет к снижению производительности исключения.

Есть ли способ указать вызывающей стороне, что задача не выполнена, без исключения исключения?

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

В вашем случае вы можете сделать:

public Task<MyResult> PerformAction(string parameter)
{
   if(parameter == "fail")
   {
      return Task.FromException<MyResult>(new Exception("You wanted me to fail."));
   }
   return MyResult.Create(parameter);
}

Не уверен, насколько это будет быстрее с точки зрения производительности.

1 голос
/ 12 июля 2020

Распространенным решением, позволяющим избежать генерации и распространения исключений, когда это возможно, является перенос результатов во внешние объекты:

public class Response<T> {
   public IEnumerable<string> Errors {get;set;}
   public bool HasErrors => Errors?.Any() ?? false;
   public bool IsSuccess {get;set;}
   public T Data {get;set;}
}

public async Task<Response<MyResult>> PerformAction(string parameter)
{
   if(parameter == "fail")
      return new Reponse<MyResult>() {
          IsSuccess = false,
          Errors = new string[] {"Failed"}
      };
   return new Response<MyResult>(){
             Result = await MyResult.Create(parameter).ConfigureAwait(false),
             IsSuccess = true
           };
}

var resultOne = await PerformAction("fail");
if (resultOne.HasErrors) { ... }
var resultTwo = await PerformAction("success");
if (resultTwo.HasErrors) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...