Мне бы хотелось услышать мнения о наилучшем способе обработки асинхронных операций с помощью шаблона Command.Допустим, у нас есть следующий пример:
public class MyCommand
{
// Sets up receiver and does whatever stuff
public void Execute()
{
_myReceiver.DoSomething();
}
}
Проблема в том, что MyCommand не знает, имеет ли MyReceiver.DoSomething () асинхронные части кода.Если бы я хотел поместить MyCommand в стек отмены после его выполнения, я не мог гарантировать, что его действие получателя было полностью выполнено, из-за чего я не мог знать, достигло ли MyCommand состояния, в котором отмена возможна или нет.
Я лично подумал о следующем решении:
- Реализация какого-либо контроля состояния в Команде
- Включение "BeginExecute" и "EndExecute" в Команду
- Включение событийв MyReceiver и заставьте команду подписаться на них (что мне кажется вонючим)
Чтобы обернуть вещи, MyCommand превратился бы в:
public class MyCommand
{
public MyCommand(MyReceiver receiver)
{
_myReceiver = receiver;
_myReceiver.DoSomethingFinished += () => this.EndExecute();
}
public void BeginExecute()
{
this.EnterExecutionState();
_myReceiver.DoSomething();
}
public void EndExecute()
{
this.LeaveExecutionState();
}
// State handling related stuff
}
Теперь у меня есть средства, чтобы сделатьуверен, что получатель команды завершил выполнение какого-либо действия, и он готов быть помещенным в стек отмены.Тем не менее, в случае спама по событиям каждый отдельный класс Receiver, содержащий асинхронные операции, действительно доставляет мне неприятности.
Я не нашел много информации об этой теме в Интернете и хотел бы услышать разные подходы.
OBS: заставить команду управлять всем асинхронным кодом, это не вариант:).