【发布时间】:2011-09-08 11:23:48
【问题描述】:
我正在使用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 块中有句柄关闭,但它需要访问客户端的私有部分。
【问题讨论】:
-
即使在非特殊情况下,您是否确保致电
WlanCloseHandle?你没有显示你的班级是否有Dispose(或者它是否被正确调用)。 -
这不是我的课,它来自API,请查看链接以获取源代码。
-
啊,好的。是的,它确实在其
Dispose中进行了清理。那么,您是否确保在您的 WlanClient 实例上调用Dispose?这是最明显的要检查的第一件事。 -
编译器说客户端没有
Dispose()方法。