32feet.NET 在 MS Surface 2 平板电脑上暂停后未重新连接
32feet.NET not reconnecting after going to suspend on an MS Surface 2 tablet
我在后台线程上使用 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。如果我禁用 surface 并将其单独放置一段时间,那么它会进入挂起状态,在打开所有 Connect() 尝试后都会抛出一个 SocketException,说明无效。它只有在我关闭并重新启动应用程序时才会恢复。
如果我在 PC 上设置飞行模式或拔出蓝牙加密狗,则不会发生这种情况,它似乎只在平板电脑挂起后才会发生。系统在连接或断开状态下是否进入suspend似乎无关紧要
我该怎么做才能避免这种状态或正常恢复?
编辑:
API 嗅探显示非托管 WSAConnect 函数不断抛出 "WSAEINVAL" 错误。
构建一个针对 .NET 4.0 的 32feet.NET 版本而不是 NuGet 提供的旧框架版本已经解决了这个问题。似乎 .NET Sockets 中的某些内容已被更改,从而消除了该问题。
我在后台线程上使用 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。如果我禁用 surface 并将其单独放置一段时间,那么它会进入挂起状态,在打开所有 Connect() 尝试后都会抛出一个 SocketException,说明无效。它只有在我关闭并重新启动应用程序时才会恢复。
如果我在 PC 上设置飞行模式或拔出蓝牙加密狗,则不会发生这种情况,它似乎只在平板电脑挂起后才会发生。系统在连接或断开状态下是否进入suspend似乎无关紧要
我该怎么做才能避免这种状态或正常恢复?
编辑: API 嗅探显示非托管 WSAConnect 函数不断抛出 "WSAEINVAL" 错误。
构建一个针对 .NET 4.0 的 32feet.NET 版本而不是 NuGet 提供的旧框架版本已经解决了这个问题。似乎 .NET Sockets 中的某些内容已被更改,从而消除了该问题。