C# Windows 10 IoT StreamSocketListener 在释放模式下随机停止监听
C# Windows 10 IoT StreamSocketListener randomly stops listening in release mode
我一直在使用“StreamSocketListener”在 PC 和 Raspberry PI 2 与 Windows 10 IoT(build 10586 TH2)之间进行一些通信。这似乎在调试模式下工作正常,但在发布模式下测试代码时,“StreamSocketListener”似乎随机停止响应请求。
在调试模式下,在 RPI2 上,我已经处理了 10 万个请求的会话,没有出现任何问题,但是当我推送发布版本时,它会随机地很快停止(通常在几百个请求之后)。请求是静态类型的,所以每次的输入都是一样的。
有没有人遇到过同样的问题,这个问题有解决办法吗?
代码基于此博客post:
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++;
}
在为我的 UWP 项目打开 "Compile with .NET Native tool chain" 设置的情况下进行了一整天的长期测试后,这个问题似乎已得到解决。禁用此功能时,问题会在几分钟后出现。
因为我不能接受评论作为答案,所以我只回答我自己的问题,并接受它。但非常感谢 Matt 为我指明了正确的方向。
Interesting... does this still reproduce if you disable .NET Native compilation? (Project properties > BUILD > "Enable .NET Native toolchain") – Matt Whilden
马特,Gnm:
我在 Win-IoT 10.0.14393.693 上的 RPi3 运行 上遇到了完全相同的问题,其 C# 代码与 Gnm 的第一个 post 中的代码非常相似:StreamSocketListener 只是停止聆听 to/receive http POST 消息,而应用程序的其余部分(网络服务器后台服务)保持响应。
但有两个区别:
a) 在我的机器上,这已经在应用程序启动后一分钟内发生,并且仅在一两个请求之后发生。
b) 它发生在 "Compile with .NET Native Tool chain" 选项切换到 "ON" 时!
受 Gnm 发现的启发,我现在将此选项切换为关闭,并且:我的问题似乎已解决。在撰写本文时,代码 运行 仅持续了一个小时,但它现在似乎可以正常工作且稳定。所以,令人惊讶的是,对我来说,与 Gnm 的解决方案完全相反......
仅供参考,我在 Windows 10 Iot c# 应用程序中遇到了同样的问题。我的是通过 "Compile with .NET Native Tool chain" 选项切换到 "ON" 然后 "Compile with .NET Native Tool chain" 选项切换到 "OFF" 修复的!
我一直在使用“StreamSocketListener”在 PC 和 Raspberry PI 2 与 Windows 10 IoT(build 10586 TH2)之间进行一些通信。这似乎在调试模式下工作正常,但在发布模式下测试代码时,“StreamSocketListener”似乎随机停止响应请求。
在调试模式下,在 RPI2 上,我已经处理了 10 万个请求的会话,没有出现任何问题,但是当我推送发布版本时,它会随机地很快停止(通常在几百个请求之后)。请求是静态类型的,所以每次的输入都是一样的。
有没有人遇到过同样的问题,这个问题有解决办法吗?
代码基于此博客post:
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++;
}
在为我的 UWP 项目打开 "Compile with .NET Native tool chain" 设置的情况下进行了一整天的长期测试后,这个问题似乎已得到解决。禁用此功能时,问题会在几分钟后出现。
因为我不能接受评论作为答案,所以我只回答我自己的问题,并接受它。但非常感谢 Matt 为我指明了正确的方向。
Interesting... does this still reproduce if you disable .NET Native compilation? (Project properties > BUILD > "Enable .NET Native toolchain") – Matt Whilden
马特,Gnm: 我在 Win-IoT 10.0.14393.693 上的 RPi3 运行 上遇到了完全相同的问题,其 C# 代码与 Gnm 的第一个 post 中的代码非常相似:StreamSocketListener 只是停止聆听 to/receive http POST 消息,而应用程序的其余部分(网络服务器后台服务)保持响应。
但有两个区别: a) 在我的机器上,这已经在应用程序启动后一分钟内发生,并且仅在一两个请求之后发生。 b) 它发生在 "Compile with .NET Native Tool chain" 选项切换到 "ON" 时!
受 Gnm 发现的启发,我现在将此选项切换为关闭,并且:我的问题似乎已解决。在撰写本文时,代码 运行 仅持续了一个小时,但它现在似乎可以正常工作且稳定。所以,令人惊讶的是,对我来说,与 Gnm 的解决方案完全相反......
仅供参考,我在 Windows 10 Iot c# 应用程序中遇到了同样的问题。我的是通过 "Compile with .NET Native Tool chain" 选项切换到 "ON" 然后 "Compile with .NET Native Tool chain" 选项切换到 "OFF" 修复的!