0

我在后台线程上使用 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”错误。

4

1 回答 1

0

构建针对 .NET 4.0 的 32feet.NET 版本而不是 NuGet 提供的旧框架版本已经解决了这个问题。似乎.NET Sockets 中的某些东西已经消除了这个问题。

于 2016-03-22T16:06:54.243 回答