У меня есть метод
public Task<Task> DoSomeWorkOnARemoteMachine()
который очень описательно выполняет некоторую работу на удаленном компьютере с помощью:
- Очередь сообщения на шине сообщений, сигнализирующая о том, что работа должна выполняться
- Удаленный агент берет сообщение и выполняет работу.
- Работа завершается, и агент ставит в очередь сообщение на шине сообщений, чтобы сказать, что работа выполнена
- Приложение, вызвавшее работу, забирает сообщение о том, что работа выполнена
Причина, по которой я использовал Task<Task>
, состоит в том, что первая Task<>
предназначена для очередности сообщения; а внутренний Task
завершается, когда работа завершена на удаленной машине (то есть когда сообщение от агента получено). Любые исключения, которые удаленный агент, захваченный во время выполнения работы, передаются вместе с сообщением о завершении и повторно запускаются, когда внутренний Task
завершается.
Чтобы вызвать этот метод, я использую:
await await DoSomeWorkOnARemoteMachine();
который будет ждать, пока сообщение будет поставлено в очередь для выполнения задания, а также для завершения задания и получения каких-либо исключений. Однако, если меня не интересовало, выполнено ли задание удаленному агенту или нет, я могу назвать его следующим:
await DoSomeWorkOnARemoteMachine();
который не был бы await
внутренним Task
. Однако внутренний Task
(который получает сообщение от удаленного агента и повторно выбрасывает исключения) все равно выполнит в какой-то момент. Я чувствую, что это немного пустая трата, и я бы хотел избежать ее выполнения, когда я не await
для результатов.
Таким образом, мой вопрос: возможно ли Task
"знать", является ли оно await
ed и не выполняется, если это не так, или выполнить какой-либо другой путь кода (например, пустой Task
тела).
Я понимаю, что есть альтернативы, которые я мог бы реализовать, например, передать флаг "огонь и забыть" или добавить перегрузку для "огня и забыть". Было бы здорово, если бы я мог реализовать это без изменения API-интерфейса клиента
Ответы, связанные с другими проектами, которые реализуют такое удаленное выполнение работы, также будут большими!