使用托管API关闭WiFi连接
本文关键字:关闭 WiFi 连接 API | 更新日期: 2023-09-27 17:58:27
我正在使用Managed WiFi API编写一个程序。以下是我如何获得范围内的所有网络:
void UpdateNetworks()
{
networks = new List<Wlan.WlanAvailableNetwork>();
WlanClient client = new WlanClient();
foreach(WlanClient.WlanInterface iface in client.Interfaces)
{
Wlan.WlanAvailableNetwork[] nets = iface.GetAvailableNetworkList(0);
foreach(Wlan.WlanAvailableNetwork net in nets)
networks.Add(net);
}
}
问题是,在18次调用该方法后,我无法再连接:
(0x80004005):试图建立到网络的会话服务器,但已经有太多已建立到该服务器的会话。
以下是抛出异常的构造函数:
public WlanClient()
{
Wlan.ThrowIfError(
Wlan.WlanOpenHandle(Wlan.WLAN_CLIENT_VERSION_XP_SP2, IntPtr.Zero, out negotiatedVersion, out clientHandle));
try
{
Wlan.WlanNotificationSource prevSrc;
wlanNotificationCallback = new Wlan.WlanNotificationCallbackDelegate(OnWlanNotification);
Wlan.ThrowIfError(
Wlan.WlanRegisterNotification(clientHandle, Wlan.WlanNotificationSource.All, false, wlanNotificationCallback, IntPtr.Zero, IntPtr.Zero, out prevSrc));
}
catch
{
Wlan.WlanCloseHandle(clientHandle, IntPtr.Zero);
throw;
}
}
我相信这是因为客户端从不关闭它打开的连接。如何明确关闭它们?catch
块中有句柄关闭,但它需要访问客户端的私有部分。
我也有同样的问题。我尝试了Joe White先生的解决方案,但我收到一个错误,即wlanClient无法转换为System.IDisposable。
由于这个问题与WlanClient实例的处理有关,我只将1个实例定义为类成员,并在方法[void UpdateNetworks()]中多次使用它。我没有收到任何错误
删除线路
WlanClient client = new WlanClient();
并在类中定义它。如下所示:
public partial class frm_main : Form
{
private WlanClient client = new WlanClient();
private void UpdateNetworks()
{
var networks = new List<Wlan.WlanAvailableNetwork>();
foreach (WlanClient.WlanInterface iface in client.Interfaces)
{
Wlan.WlanAvailableNetwork[] nets = iface.GetAvailableNetworkList(0);
foreach (Wlan.WlanAvailableNetwork net in nets)
networks.Add(net);
}
MessageBox.Show(networks.Count.ToString());
}
}
参考:托管WiFi错误
由于只有在一定数量的迭代之后才会看到问题,因此问题可能是某种资源耗尽,这听起来像是资源没有及时清理。
从上面的评论中,听起来您没有处理WlanClient
实例,这可能是问题的一部分(或全部)。不过,我能理解你为什么不处理它们,因为它们没有给你任何明显的方法。这对他们来说似乎是一个非常有问题的设计。有各种各样的设计准则说,像这样的类应该给你一个公共的Dispose
方法或一个公共Close
方法,但即使它们都有这两个方法,它们也故意将它们都设为私有的。
但是该类确实实现了IDisposable
,所以您仍然可以通过添加using
块来清理它:
using (var wlanClient = new WlanClient()) {
....
} // wlanClient will be disposed when flow leaves the block
这将确保在流离开using
块时清理对象的所有资源(即使流因为出现异常而离开)。您的连接将被关闭,非托管内存将被释放,以及其他需要发生的事情。