Как разрешить только одну выполненную задачу, используя потоки или буферизировать событие потока при выполнении длинной операции - PullRequest
0 голосов
/ 31 октября 2019

У меня есть какой-то процесс, который можно вызывать периодически и принудительно. Процесс может занять некоторое время. Мне нужно запретить запуск следующего automatic task до тех пор, пока forcible task все еще выполняется, или мне нужно запретить forcible task до тех пор, пока automatic task все еще выполняется (т.е. разрешено только одна активная задача). Да, я понимаю, что могу использовать некоторый флаг _isBusy, чтобы определить, выполняется ли еще задание, и пропустить добавление в сток. Но может быть есть более элегантное решение с использованием потоков (rxdart)? Более того, я хотел бы , если события не будут пропущены, но буферизированы, поэтому, когда активное задание будет выполнено, следующее событие будет взято из _controller.stream.

class Processor {
  bool _isBusy;
  final _controller = StreamController<int>.broadcast();

  Processor() {
    _controller.stream.listen((_) async {
      if (!_isBusy) {
        await _execTask(); // execute long task
      }
    });
  }

  void startPeriodicTask() {
    Stream.periodic(duration: Duration(seconds: 15)).listen((_) {
      _controller.sink.add(1);
    })
  }

  void execTask() {
    _controller.sink.add(1);
  }

  void _execTask() async {
    try {
      _isBusy = true;
      // doing some staff
    } finally {
      _isBusy = false;
    }        
  }
}
...