NetworkAdapter.GetConnectedProfile 线程要求

问题描述 投票:0回答:1

我正在尝试在我的应用程序中管理 wifi 内容,并且需要获取当前连接网络的配置文件。据我所知,代码是正确的,但我遇到了线程错误。

我已经验证这是在线程 1 上执行的。这是应用程序中访问这些 api 的唯一代码。我不知道它期望我在哪个线程上执行它。

这是一个使用 winRT 库的 WPF 应用。

错误:

The application called an interface that was marshalled for a different thread. (0x8001010E (RPC_E_WRONG_THREAD))

代码:

var access = await WiFiAdapter.RequestAccessAsync();
if (access != WiFiAccessStatus.Allowed) { Networks = new List<WiFiAvailableNetwork>(); return; }

var adapters = await WiFiAdapter.FindAllAdaptersAsync();
if (!adapters.Any()) return;

Adapter = adapters.First();
await Adapter.ScanAsync();
Networks = Adapter.NetworkReport.AvailableNetworks;

IReadOnlyList<ConnectionProfile> profiles = Array.Empty<ConnectionProfile>();
Application.Current.Dispatcher.Invoke(() => profiles = NetworkInformation.GetConnectionProfiles());
ConnectionProfiles = profiles;

ConnectionProfile profile = default;
try { profile = await Adapter.NetworkAdapter.GetConnectedProfileAsync(); } // <= fails here
catch (Exception ex) { Log.Exception(ex); }

我也尝试了下面的两种选择,但它们都因同样的错误而失败。

await Application.Current.Dispatcher.Invoke(async () => profile = await Adapter.NetworkAdapter.GetConnectedProfileAsync());
await Application.Current.Dispatcher.InvokeAsync(async () => profile = await Adapter.NetworkAdapter.GetConnectedProfileAsync());
c# wifi .net-7.0
1个回答
1
投票

这些对象和方法使用通常不是线程安全的 COM 调用。仅仅将

NetworkInformation.GetConnectionProfiles()
放入
Invoke
是不够的,对返回对象的整个访问必须在同一个线程上。

所以要么将整个功能放入

Application.Current.Dispatcher.Invoke
,要么从
NetworkInformation.GetConnectionProfiles()
中删除它。

© www.soinside.com 2019 - 2024. All rights reserved.