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 中的某些内容已被更改,从而消除了该问题。