Поэтому у меня есть этот метод в моем регуляторе:Размножается Асинхронный/Await Метод вызовов
protected async Task<KeyValuePair<bool, string>> ExecuteSimpleQuery(Func<Task<bool>> service)
{
var success = false;
var message = string.Empty;
try
{
success = await service.Invoke();
}
catch (Exception exception)
{
message = exception.Message;
success = false;
}
return new KeyValuePair<bool, string>(success, message);
}
Я хочу, чтобы использовать его как это:
public async Task<ActionResult> Login(RegisterDto register)
{
var objectStore =
await this.ExecuteSimpleQuery(async() => await this.securityService.LoginAsync(register.UserName, register.Password, true));
if (objectStore.Key)
{
return this.RedirectToAction("Index", "Toolbox");
}
this.TempData["error"] = objectStore.Value;
return this.View(register);
}
Так что я проходящее до ExecuteSimpleQuery
это метод awaitable
LoginAsync
, я просто хочу убедиться, что я правильно ожидаю метод.
Мой мыслительный процесс:
LoginAsync
возвращаетTask<bool>
поэтомуFunc
должен вернуть это.- При передаче, вы можете
await
, так. - Поскольку
Func
возвращаетTask<bool>
внутриExecuteSimpleQuery
вы можетеawait
его там, так должен ExecuteSimpleQuery
ожидает метод, поэтому должен иметьasync
ключевое слово и, следовательно, должен вернутьTask<T>
.- Последняя точка распространяется на действие
Login
, этот метод возвращаетTask<T>
, поэтому его можно ожидать, так что должно.
Я даже близко?
Почему так сложно? Кому вы делегируете логин на 'ExecuteSimpleQuery'? –
Использование сервисной архитектуры У меня есть действительно последовательный способ вызова службы, поэтому вместо того, чтобы писать «try ... catch» все время, я пишу его один раз и обрабатываю одно и то же каждый раз. Просто намного проще и менее утомительно –