C#Windows 10 IoT StreamSocketListener在发布模式下随机停止侦听

C#Windows 10 IoT StreamSocketListener在发布模式下随机停止侦听,c#,uwp,windows-10-iot-core,C#,Uwp,Windows 10 Iot Core,我一直在使用“StreamSocketListener”在一台PC和一台Raspberry PI 2之间使用Windows 10 IoT(build 10586 TH2)进行通信。这在调试模式下似乎可以正常工作,但在发布模式下测试代码时,“StreamSocketListener”似乎会随机停止响应请求 在调试模式下,在RPI2上,我的会话有100k个请求,没有一个问题,但是当我推送发布版本时,它会很快随机停止(通常在几百个请求之后)。请求是静态类型,因此每次输入都是相同的 有没有人遇到过同样的

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

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

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

代码基于以下博客文章:


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

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


有趣的。。。如果禁用.NET本机编译,是否仍会重现这种情况?(项目属性>构建>“启用.NET本机工具链”)–Matt Whilden

马特,Gnm: 我在Win IoT 10.0.14393.693上运行的RPi3上遇到了完全相同的问题,其C#代码与Gnm的第一篇文章中的代码非常相似:StreamSocketListener只是停下来收听/接收http post消息,而应用程序的其余部分(web服务器后台服务)保持响应

但有两个区别: a) 在我的机器上,这已经在应用程序启动后一分钟内发生了,而且只有一两个请求。 b) 它发生在“使用.NET原生工具链编译”选项切换到“打开”时


受Gnm发现的启发,我现在将此选项关闭,并且:我的问题似乎得到了解决。在编写本文时,代码只运行了一个小时,但现在它似乎工作正常且稳定。所以,令人惊讶的是,对我来说,Gnm的解决方案正好相反

仅供参考,Windows 10 Iot c#应用程序也存在同样的问题。我的问题被“使用.NET原生工具链编译”选项切换为“打开”,然后“使用.NET原生工具链编译”选项切换为“关闭”修复了

有趣的。。。如果禁用.NET本机编译,是否仍会重现这种情况?(项目属性>构建>“启用.NET本机工具链”)它已设置为禁用(未选中),因此我尝试启用它并在RPI2上以发布模式运行它。现在我已经运行了近5万个请求,没有任何问题。。。我不知道这告诉了我什么,你能提供关于这方面的额外信息吗,Matt?.NET Native是我们新的用于UWP应用程序的提前编译堆栈。登录页有点过时,但您可以在此处找到更多信息:。现在还不清楚为什么这会解决这个问题,但这将是商店提供UWP应用程序的方式。。。那也许这就足够了?很抱歉,我无法立即发挥更大的作用-(好的,谢谢你提供更多的信息!我将在启用和禁用设置的情况下进行更多的测试,检查它是否真的解决了问题。测试结束后,我将更新我的问题,很可能会接受你的评论作为答案。听起来不错。如果.NET Native给你其他问题,你可以在do向我的团队发送邮件。)tnetnative@microsoft.com.祝你好运!同样的问题,同样的莫名其妙的解决方案。与本机工具链不同的一个重要线索是,当服务器处理套接字时,客户端现在可以正确地检测/握手连接是否已关闭。以前,来自客户端的
nc myIp myPort
从未完成…w这让人怀疑服务器是否存在同样的问题,那就是套接字泄漏。谢谢,@Gnm和@matt whilden
 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++;
    }