* Electron Version 6.0.0-beta.12
* Operating System Windows 10 64 bit

Expected Behavior
webContents.print() should send print a job to the specified printer

Actual behavior
Nothing happens. Callback gets called much latter, for example on program exit.

To Reproduce
let print_options = { 
    silent: true,
    printBackground: true,
    deviceName: barcode_device_name 
}
print_window.webContents.print(print_options, (data) => {
    console.log(`print result: ${data}`)
})

Related to #17260
shell/browser/api/atom_api_web_contents.cc
base::Value arguments,
                         InvokeCallback callback) {
  
  EmitWithSender("-ipc-invoke", bindings_.dispatch_context(),
                 std::move(callback), channel, std::move(arguments));
}
void WebContents::MessageSync(bool internal,
                              const std::string& channel,
                              base::Value arguments,
                              MessageSyncCallback callback) {
  
  
  EmitWithSender("-ipc-message-sync", bindings_.dispatch_context(),
                 std::move(callback), internal, channel, std::move(arguments));
}
void WebContents::MessageTo(bool internal,
                            bool send_to_all,
                            int32_t web_contents_id,
                            const std::string& channel,
                            base::Value arguments) {
  auto* web_contents = mate::TrackableObject<WebContents>::FromWeakMapID(
      isolate(), web_contents_id);
  if (web_contents) {
    web_contents->SendIPCMessageWithSender(internal, send_to_all, channel,
                                           base::ListValue(arguments.GetList()),
                                           ID());
  }
}
void WebContents::MessageHost(const std::string& channel,