public IAsyncResult BeginRefresh(AsyncCallback callback) { AsyncNoResult result = new AsyncNoResult(callback); var request = new vx_req_aux_get_render_devices_t(); _client.BeginIssueRequest(request, ar => { vx_resp_aux_get_render_devices_t response; try { response = _client.EndIssueRequest(ar); _devices.Clear(); for (var i = 0; i < response.count; ++i) { var device = VivoxCoreInstance.get_device(i, response.render_devices); var id = device.device; var name = device.display_name; _devices[id] = new AudioDevice { Key = id, Name = name }; } _systemDevice = new AudioDevice { Key = response.default_render_device.device, Name = response.default_render_device.display_name }; _communicationDevice = new AudioDevice { Key = response.default_communication_render_device.device, Name = response.default_communication_render_device.display_name }; var effectiveDevice = new AudioDevice { Key = response.effective_render_device.device, Name = response.effective_render_device.display_name, }; if (!effectiveDevice.Equals(_effectiveDevice)) { // Only fire the event if the effective device has truly changed. _effectiveDevice = effectiveDevice; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(EffectiveDevice))); } result.SetComplete(); } catch (Exception e) { VivoxDebug.Instance.VxExceptionMessage($"{request.GetType().Name} failed: {e}"); result.SetComplete(e); if (VivoxDebug.Instance.throwInternalExcepetions) { throw; } return; } }); return(result); }