Мне необходимо периодически синхронизировать некоторые данные с сервером после истечения некоторого интервала.И, конечно же, мне нужно сделать это асинхронно.Но иногда мне нужно синхронизировать данные без интервала ожидания.И мне также нужно, чтобы каждый следующий «процесс синхронизации» запускался после каждого предыдущего процесса. Два процесса одновременно невозможны. У меня есть некоторые реализации для этого.Моя идея заключается в использовании потоков и списков.
У меня есть поток в некотором классе управления с зарегистрированным слушателем.Когда указанный интервал истек, я просто вызываю метод manager.AddAsyncTask
, который помещает задачу в поток.Слушатель берет задачу из потока и обрабатывает ее.Задача - это экземпляр класса синхронизации с методом run
.Пример кода:
class SyncManager
final _task = StreamController<task>.broadcast();
final _tasks = List<Task>[];
void addTaskAsync(Task task) {
_task.add(task); // send task to stream
}
void addTaskSync(Task task) async {
_tasks.add(task); // add tasks to list
if (_tasks.isNotEmpty) {
await run();
}
}
SyncManager() {
_task.listen((task) {
if (task.isSynchronous) {
return;
}
task.sync.run(forced: task.forced)
.then((done) {
if (done) {
// do some staff
}
});
});
}
Для «сразу» задач я вызываю manager.AddSyncTask
и помещаю эти задачи в Список.Этот список обрабатывается синхронно с использованием цикла while
, и кажется, что это проблема, потому что иногда этот цикл никогда не заканчивается и поток GUI блокируется.: (
void run() async {
while (_tasks.isNotEmpty) {
final task = _tasks.first;
final done = await task.sync.run(forced: task.forced);
if (done) {
// do other staff
}
}
}
Я все еще вижу, как использовать потоки для реализации моих требований, но я не могу что-то придумать и собрать пазл. Говоря об условиях программирования без трепетания, янужна возможность обрабатывать несколько последовательных процессов где-то в отдельном «потоке», чтобы не блокировать графический интерфейс.
Не могли бы вы предложить какие-нибудь идеи?