когда цикл событий начинается в Dart и как работает очередь событий - PullRequest
0 голосов
/ 05 октября 2019

Первый вопрос: когда начинается цикл обработки событий? Я прочитал на сайте, что он запускается после основного метода, но почему, когда мы пытаемся что-то вроде этого

main()async {
Future(()=>print('future1'));
await Future(()=>print('future2'));
print('end of main');
}

//the output is :
//future1
//future2
//end of main

, в этом примере цикл событий начинается, когда мы используем ключевое слово await и после того, как цикл событий достигает будущего2это приостановлено? или я ошибаюсь: (

Второй вопрос: как события добавляются в очередь событий, если это FIFO, почему в этом примере будущее 2 завершается раньше будущего 1

main(){
Future.delayed(Duration(seconds:5) , ()=>print('future1'));
Future.delayed(Duration(seconds:2) , ()=>print('future2')); 
}

1 Ответ

0 голосов
/ 05 октября 2019

Цикл событий запускается, когда больше ничего не выполняется (например, основной метод завершен, вы ожидаете завершения в будущем).

Ваш пример имеет смысл, поскольку первая строка помещает событие в очередь событийтак что теперь первый элемент в очереди "print ('future1')". В следующей строке вы помещаете другое событие в очередь, которое вызывает «print ('future2')», и теперь вы ждете, когда это событие будет выполнено.

Поскольку основной метод не ожидает чего-то, тоцикл обработки будет выполняться. Поскольку первое событие в очереди было «print ('future1')», то это будет выполнено первым. Но так как основной метод все еще ожидает завершения "print ('future2')" в будущем, цикл обработки событий выполняет другое событие, которое будет "print ('future2')".

Так как это событие было тем, которого ожидал основной метод (и в очереди событий больше нет событий), то main () выполнит последний вызов "print ('end of main')".

В следующем примере вы думаете, что Future и Future.delayed - это то же самое, что и нет. С Future.delayed в очереди событий не происходит никаких событий. Вместо этого за пределами виртуальной машины запущен поток, который знает, когда должен сработать следующий таймер, что в итоге приводит к тому, что событие помещается в очередь. Таким образом, событие помещается в очередь событий только после истечения таймера (и, следовательно, future2 будет выполняться первым).

...