我在后台线程上使用 BluetoothClient 来轮询 BT 客户端并在那里连接一次。我的线程代码如下所示:
while (true)
{
try
{
using (var client = new BluetoothClient { InquiryLength = TimeSpan.FromSeconds(INQUIRY_MAX_DURATION)} )
{
var curAddr = ...;
var ep = new BluetoothEndPoint(curAddr, BluetoothService.SerialPort);
client.Connect(ep);
if (client.Connected)
{
using(var stream = client.GetStream())
{
try
{
//Do stuff on stream
}
catch(IOException) { }
}
}
}
}
catch (PlatformNotSupportedException)
{
Thread.Sleep(STACK_NOT_FOUND_RETRY_INTERVAL);
}
catch (SocketException ex)
{
Thread.Sleep(CONNECTION_FAILED_RETRY_INTERVAL);
}
}
只要它没有进入挂起状态,这确实可以在大多数计算机上连接并正常工作,包括带有 Windows 8.1 Pro 的 MS Surface。如果我禁用表面并将其单独放置一段时间以使其进入挂起状态,则在打开所有 Connect() 尝试后会抛出 SocketException 说无效。只有当我关闭并重新启动应用程序时它才会恢复。
如果我在 PC 上设置飞行模式或拉蓝牙加密狗,则不会发生这种情况,它似乎仅在平板电脑暂停后发生。系统是否在连接或断开状态下进入挂起似乎并不重要。
我可以做些什么来避免这种状态或正确恢复?
编辑: API 嗅探显示非托管 WSAConnect 函数不断抛出“WSAEINVAL”错误。