【问题标题】:C# Windows 10 IoT StreamSocketListener randomly stops listening in release modeC# Windows 10 IoT StreamSocketListener 在发布模式下随机停止监听
【发布时间】:2016-04-26 21:21:08
【问题描述】:

我一直在使用“StreamSocketListener”在 PC 和带有 Windows 10 IoT(build 10586 TH2)的 Raspberry PI 2 之间进行一些通信。这在调试模式下似乎工作正常,但在发布模式下测试代码时,“StreamSocketListener”似乎随机停止响应请求。

在调试模式下,在 RPI2 上,我有 10 万个请求的会话没有一个问题,但是当我推送发布版本时,它会随机停止,很快(通常在数百个请求之后)。请求是静态类型的,所以每次的输入都是一样的。

有没有人遇到过同样的问题,有解决这个问题的办法吗?

代码基于这篇博文:

A simple in-process HTTP server for Windows 8 Metro apps

 private void Listen()
 {
      _listener = new StreamSocketListener();
      _listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket);
      _listener.BindServiceNameAsync(requestPort.ToString());
 }
private async void ProcessRequestAsync(StreamSocket socket)
    {
        try
        {
            // this works for text only
            StringBuilder request = new StringBuilder();
            using (IInputStream input = socket.InputStream)
            {
                byte[] data = new byte[BufferSize];
                IBuffer buffer = data.AsBuffer();
                uint dataRead = BufferSize;
                while (dataRead == BufferSize)
                {
                    await input.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial);
                    request.Append(Encoding.UTF8.GetString(data, 0, data.Length));
                    dataRead = buffer.Length;
                }
            }

            using (IOutputStream output = socket.OutputStream)
            {
                string requestMethod = request.ToString().Split('\n')[0];
                string[] requestParts = requestMethod.Split(' ');

                if (requestParts[0] == "GET")
                    await WriteResponseAsync(requestParts[1], output);
                else
                    throw new InvalidDataException("HTTP method not supported: "
                                                   + requestParts[0]);
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine("Main ex: " + e);
        }
        RequestCount++;
    }

【问题讨论】:

  • 有趣...如果禁用 .NET Native 编译,这还会重现吗? (项目属性 > BUILD > “启用 .NET Native 工具链”)
  • 它已经被设置为禁用(未选中),所以我试图做的是启用它并以发布模式在 RPI2 上运行它。现在我已经运行了近 5 万个请求,没有任何问题......我不确定这告诉我什么,你能提供关于此的额外信息吗,马特?
  • .NET Native 是我们用于 UWP 应用程序的新的提前编译堆栈。登录页面有点过时,但您可以在此处找到更多信息:msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx。目前尚不清楚为什么这会解决问题,但这将是从商店提供 UWP 应用程序的方式......所以也许这已经足够好了?抱歉,我不能立即派上用场。 :-(
  • 好的,感谢您提供更多信息!我将在启用和禁用设置的情况下进行更多测试,检查它是否真的解决了问题。我会在测试结束后更新我的问题,并且很可能会接受您的评论作为答案。
  • 听起来不错。如果 .NET Native 给您带来其他问题,您可以通过 dotnetnative@microsoft.com 向我的团队发送邮件。祝你好运!

标签: c# uwp windows-10-iot-core


【解决方案1】:

在为我的 UWP 项目打开“使用 .NET Native 工具链编译”设置进行一整天的长期测试后,此问题似乎已得到解决。禁用此功能时,几分钟后就会出现问题。

因为我不能接受评论作为答案,所以我只会回答我自己的问题并接受它。但感谢马特为我指明了正确的方向。

有趣...如果禁用 .NET Native 编译,这还会重现吗? (项目属性 > BUILD > “启用 .NET Native 工具链”)——Matt Whilden

【讨论】:

  • 同样的问题,同样莫名其妙的解决方案。与 Native Toolchain 可验证的不同之处的重要线索是,客户端现在正确地检测/握手,当服务器处理 Socket 时连接已关闭。以前,来自客户端的nc myIp myPort 从未完成......这让人想知道服务器是否有同样的问题是泄漏套接字。谢谢@Gnm 和@matt-whilden
【解决方案2】:

马特,Gnm: 我在 Win-IoT 10.0.14393.693 上运行的 RPi3 上遇到了完全相同的问题,其 C# 代码与 Gnm 的第一篇文章中的代码非常相似:StreamSocketListener just stop to listen to/receive http POST messages while the rest of the app (网络服务器后台服务)保持响应。

虽然有两个区别: a)在我的机器上,这已经在应用程序启动后一分钟内发生,并且仅在一两个请求之后发生。 b)它发生在“使用 .NET Native Tool chain 编译”选项切换到“ON”时!

受 Gnm 发现的启发,我现在已将此选项切换为关闭,并且:我的问题似乎已解决。在撰写本文时,代码只运行了一个小时,但现在看来可以正常工作且稳定。所以,令人惊讶的是,对我来说,与 Gnm 的解决方案完全相反......

【讨论】:

    【解决方案3】:

    仅供参考,我在 Windows 10 Iot c# 应用程序中遇到了同样的问题。我的问题是通过将“使用 .NET Native Tool chain 编译”选项切换为“ON”然后将“使用 .NET Native Tool chain 编译”选项切换为“OFF”来修复的!

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2018-06-24
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多