Рассмотрим этот метод:Async void или Task.Run?
public Status SendMessage(InParam inParam)
{
try
{
Task.Run(() => MethodAsync(inParam));
return Status.Success;
}
catch (Exception ex)
{
// Log the exception
return Status.Failed;
}
}
Метод MethodAsync:
public async Task<Status> MethodAsync(InParam inParam)
{
try
{
return await processor.Process(inParam);
}
catch (Exception ex)
{
// Log exception
return Status.Failed;
}
}
и метод процесса:
public async Task<Status> Process(InParam inParam)
{
try
{
IMessage endpoint = (IMessage)Activator
.CreateInstance(Type.GetType(_message.AgentDLLName), args);
_messageDispatchers.Add(endpoint);
foreach (IMessage dispatcher in _messageDispatchers)
{
await Task.Run(() => dispatcher.SendMessage(_message));
}
return await Task.Run(() => Status.Success);
}
catch (Exception ex)
{
// Log exception
return Status.Failed;
}
}
Таким образом, использование случай, что в конце некоторой обработки рабочего процесса электронная почта должна быть отправлена. Эта часть отправки электронной почты занимает некоторое время, и пользователю пришлось подождать, поэтому первоначальный разработчик разместил этот код.
Я пытаюсь сделать SendMessage вызов MethodAsync и не должен ждать его возврата. Я прочитал, что в асинхронном рабочем процессе полный стек должен быть асинхронным, чтобы он работал правильно. SendMessage не помечен async.
Правильно ли это вызов метода MethodAsync, поскольку Task.Run возвращает ожидаемый?
'return wait Task.Run (() => Status.Success);' - эта строка выглядит так, как будто это должно быть 'return Status.Success', no? –
Спасибо, что указали это. Это на самом деле находится в производственном коде, а не опечатка. Я добавил цикл for теперь в вопросе, который я пропустил раньше. – Codehelp
@Codehelp: Все еще не имеет никакого смысла. 'return wait Task.Run (() => Status.Success);' приводит к той же логике, что и 'return Status.Success;', но вызовет дополнительный контекст-переключатель, который просто тратит время CPU ... – ChrFin