Хотя я не Аль Томас, я все еще могу помочь. ;)
Для работы асинхронных вызовов c должен быть запущен основной l oop, обычно из основного потока программы. Таким образом, вы хотите создать и выполнить основную l oop из вашей функции main()
, а не из кода вашего приложения:
int main (string[] args) {
var loop = new GLib.MainLoop ();
var radio_browser = new RadioBrowser ();
// set up async calls here
// then set the main loop running as the last thing
loop.run();
}
Также, если вы хотите ждать асинхронного вызова c для завершения обычно требуется выполнить вызов с использованием ключевого слова yield
из другой функции asyn c Например:
public async Gee.ArrayList<Station> listStations () {
…
// When this call is made, execution of listStations() will be
// suspended until the soup response is received
yield session.send_async(msg);
// Execution then resumes normally
check_response_status (msg);
parser.load_from_data ((string) msg.response_body.flatten ().data);
…
return stations;
}
Затем вы можете вызвать его из (non-asyn c) main функция с использованием записи listStations.begin(…)
:
int main (string[] args) {
var loop = new GLib.MainLoop ();
var radio_browser = new RadioBrowser ();
radio_browser.listStations.begin((obj, res) => {
var stations = radio_browser.listStations.end(res);
…
loop.quit();
});
loop.run();
}
В качестве дальнейшего чтения я бы порекомендовал раздел asyn c Учебного пособия по Vala и asy c примеры также в вики.