In the past, SoupSession was an abstract class, and users needed to choose between SoupSessionAsync (which always uses GMainLoop-based I/O), or SoupSessionSync (which always uses blocking I/O and can be used from multiple threads simultaneously). This is no longer necessary; you can (and should) use a plain SoupSession, which supports both synchronous and asynchronous use. (When using a plain SoupSession, soup_session_queue_message() behaves like it traditionally did on a SoupSessionAsync, and soup_session_send_message() behaves like it traditionally did on a SoupSessionSync.)
According to developer.gnome.org