#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) );
}