最后一个适合这个网站的问题。
我有一个 .NET TCP 服务器。这是我的第一台服务器,运行良好。客户端的加入、管理和可以加入聊天室等。但是,大约 30 分钟后,在建立一个客户端后,我在 NetworkStream.ReadAsync 期间收到 System.StackOverflowException。我完全不知道问题是什么。每次都会发生。
以下是有关我的 TCP 服务器的客户端类的重要详细信息,其中在客户端加入时会创建一个新的客户端。
public class Client {
public TcpClient tcpClient;
public NetworkStream stream;
public CancellationTokenSource cts = new CancellationTokenSource();
private byte[] readBuffer = new byte[1024];
private StringBuilder receiveString = new StringBuilder();
public Client(TcpClient tcpClient) {
this.tcpClient = tcpClient;
this.stream = this.tcpClient.GetStream();
}
public void StartReadAsync(){
ReadAsync(cts.Token);
}
private async Task ReadAsync(CancellationToken ct) {
// Stackoverflow exception occurs on next line after 20-30 mins
int amountRead = await stream.ReadAsync(readBuffer, 0, readBuffer.Length, ct);
if (amountRead > 0) {
string message = Encoding.UTF8.GetString(readBuffer, 0, amountRead);
receiveString.Append(message);
Console.WriteLine("Client " + name + " sent: " + message);
if (receiveString.ToString().IndexOf(eof) > -1) {
// Full message received, otherwise keep reading
if (OnClientRead != null)
OnClientRead(this, new SocketEventArgs(this, receiveString.ToString()));
receiveString.Clear();
}
}
ReadAsync(ct);
}
}
最佳答案
您正在进行重入调用,ReadAsync 再次调用 ReadAsync,所以是的,您将以 StackOverflow 异常结束。
将您的代码更改为:
public class Client
{
public TcpClient tcpClient;
public NetworkStream stream;
public CancellationTokenSource cts = new CancellationTokenSource();
private byte[] readBuffer = new byte[1024];
private StringBuilder receiveString = new StringBuilder();
public Client(TcpClient tcpClient) {
this.tcpClient = tcpClient;
this.stream = this.tcpClient.GetStream();
}
public async void StartReadAsync(){
while(await ReadAsync(cts.Token));
}
private async Task<bool> ReadAsync(CancellationToken ct)
{
try
{
int amountRead = await stream.ReadAsync(readBuffer, 0, readBuffer.Length, ct);
if (amountRead > 0)
{
string message = Encoding.UTF8.GetString(readBuffer, 0, amountRead);
receiveString.Append(message);
Console.WriteLine("Client " + name + " sent: " + message);
if (receiveString.ToString().IndexOf(eof) > -1)
{
// Full message received, otherwise keep reading
if (OnClientRead != null)
OnClientRead(this, new SocketEventArgs(this, receiveString.ToString()));
receiveString.Clear();
}
return true;
}
return false;
}
catch { return false; }
}
}
关于c# - 异步 TCP 读取期间的 Stackoverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32281114/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.