use our own queue, do not use blocking code in main thread