как вернуть метод с типом возврата task

#c# #asynchronous

#c# #асинхронный

Вопрос:

 public override Task<IdentityResult> ValidateAsync(AppUser item)
        {
            if(item.Email != "a@a.com")
            {
                IEnumerable<string> errors = new List<string>() { "error1" };

            }           
        }
  

Identityresult просто нуждается в простом массиве или ienumerable строк в его конструкторе.

Какой правильный синтаксис?

Ответ №1:

Если вам абсолютно необходимо использовать ValidateAsync() вместо просто Validate(), используйте TaskCompletionSource для имитации.

 public override Task<IdentityResult> ValidateAsync(AppUser item)
{
    var result = new IdentityResult();
    var tcs = new TaskCompletionSource<IdentityResult>();

    if(item.Email != "a@a.com")
    {
        IEnumerable<string> errors = new List<string>() { "error1" };
        result.Add(errors)
    }   
    tcs.SetResult(result);        
    return tcs.Task;
}
  

Использование Task.Run создает ненужные накладные расходы.

РЕДАКТИРОВАТЬ: я не совсем уверен, что TaskCompletionSource лучше, чем Task.Run . Я хотел бы услышать ответ.

Комментарии:

1. Таким образом, представляется более эффективным использовать TaskCompletionSource, потому что нет накладных расходов на планирование. Смотрите blogs.msdn.com/b/pfxteam/archive/2009/06/02/9685804.aspx

Ответ №2:

Вы могли бы использовать Task.Run() для запуска и получения ссылки на новый Task :

 public IdentityResult Validate( AppUser item )
{
     IdentityResult resu< 

     // do stuff

     return resu<
}

public override Task<IdentityResult> ValidateAsync( AppUser item )
{
    return Task.Run( () => Validate(item) );
}