Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步客户端-访问字符串冻结接收线程_C#_Multithreading_Node.js_Sockets - Fatal编程技术网

C# 异步客户端-访问字符串冻结接收线程

C# 异步客户端-访问字符串冻结接收线程,c#,multithreading,node.js,sockets,C#,Multithreading,Node.js,Sockets,我正在编写一个C#客户端来连接Node.JS服务器。一切正常,但接收功能一度停止工作。我能够确定访问客户端接收的字符串是冻结线程。一些代码摘录: Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); byte[] byteData = new byte[2048]; ... setup socket connection ... socket.BeginRece

我正在编写一个C#客户端来连接Node.JS服务器。一切正常,但接收功能一度停止工作。我能够确定访问客户端接收的字符串是冻结线程。一些代码摘录:

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] byteData = new byte[2048];

... setup socket connection ...

socket.BeginReceive(byteData, 0, byteData.Length,
    SocketFlags.None, new AsyncCallback(OnReceive), null);

private void OnReceive(IAsyncResult ar)
{
    socket.EndReceive(ar);

    stringData = Encoding.ASCII.GetString(byteData).Trim();

    Console.WriteLine("Before string");
    Console.WriteLine(stringData);
    Console.WriteLine("After string");

    // always ready to asynchronously receive
    socket.BeginReceive(byteData, 0, byteData.Length,
        SocketFlags.None, new AsyncCallback(OnReceive), null);
}
当从Node.JS接收到“OK”时,将输出以下内容:

Before string
OK

而且换行符甚至不是由控制台编写的,因为系统输出直接在同一行的“OK”之后继续。任何后续接收都不会显示任何内容。我不知道这可能是什么原因造成的,而且我似乎找不到任何其他遇到此问题的人。

socket.EndReceive
返回一个值,告诉您实际读取了多少字节。您需要获取该值并将其传递给
GetString
方法:

int bytesRead = socket.EndReceive(ar);
stringData = Encoding.ASCII.GetString(byteData, 0, bytesRead);
否则,
GetString
将尝试转换整个字符串。那会给你带来各种各样的垃圾。您对
Trim()
的现有调用正在删除由当前执行方式导致的尾随nul字节,但如果将部分填充的缓冲区传递给下一个调用,这不会阻止您获得垃圾


也就是说,我看不到会导致锁死的东西。您确定没有更改代码的其他部分,这导致了锁定吗?

是的,我确定这不是代码的另一部分,因为我使用了
git reset--hard HEAD
,问题仍然存在。这让我怀疑Node.JS端是否存在问题,但我看不出这会对客户端产生什么影响。编辑:使用
bytesRead
修复它。我不知道为什么它以前有效,现在不行,但我很感激它的解决办法。@BenJuan26:很高兴它解决了你的问题。知道缓冲区中有什么东西会很有趣。我的假设是,转换整个2048个字符的缓冲区会导致某些字符的输出出现长时间延迟。例如,如果您创建一个由2048个
BEL
字符(
chr(7)
)组成的字符串,然后将其输出,计算机将发出2048次单独的蜂鸣声。这需要很长时间。