У меня возникли проблемы с написанием асинхронной функции в Vala.
Я понимаю, что обратный вызов функции должен быть где-то зарегистрирован, чтобы выполнение продолжалось после операторов yield, поэтому я добавляю его в основной цикл GLib для периодического вызова. используя Idle.add
. Вот мой фиктивный код:
async void loop_func()
{
var id = Idle.add(loop_func.callback);
message("Added idle %u",id);
yield;
message("yielded successfully 1");
yield;
message("yielded successfully 2");
for (var i = 0; i < 20; i++)
{
message("%d",i);
yield;
}
message("finished");
}
int main()
{
var loop = new GLib.MainLoop();
loop_func.begin(() => {loop.quit();});
loop.run();
return 0;
}
Несмотря на это, код после второго оператора yield никогда не выполняется. Это видно из вывода:
$ ./async
** Message: 20:07:24.932: async.vala:4: Added idle 1
** Message: 20:07:24.932: async.vala:7: yielded successfully 1
А потом зависает.
Что я здесь упускаю?
yield;
. Вы взяли этот пример откуда-то, что может дать больше контекста? - person ptomato   schedule 10.09.2020yield
является организация асинхронного обратного вызова, поэтому, когда трудоемкая операция завершается в отдельной функции, поток возвращается к выходу, GIO имеет множество асинхронных функций, например.yield file.mount_mountable (MountMountFlags.NONE);
- person AlThomas   schedule 10.09.2020yield some_other_async_function();
, но я не нашел ни одной с несколькимиyield;
. - person ptomato   schedule 11.09.2020