C#代理回调的奇怪行为
本文关键字:代理 回调 | 更新日期: 2023-09-27 17:58:16
我写了一个类,它应该提供与NodeJS服务器的基本交互。这个类还包括TcpClient实例,并且异步工作(BeginRead、BeginWrite等方法),因此许多函数都将回调(使用lambda表达式的匿名函数)作为参数。问题从这个场景开始(我试图说明类似于原始代码的平静)。
this._nodeJS.Send("DATA_TO_SEND", (Response) => {
Console.WriteLine(Response);
// Section1
this._nodeJS.Send("ANOTHER_DATA", (Response1) => {
Console.WriteLine(Response1);
});
});
问题出现在Section1中。当它被注释掉时,程序的行为和预期的一样。收到写入控制台的响应。当它没有被评论掉时,它开始表现得很奇怪。Section1中对Console的写入不起作用(在许多情况下),而且,重要的是,本节中Console.WriteLine下面的代码没有执行,"线程"只是在命令之前停止。我试着一步一步地调试它,Section1中的变量设置正确,当我进入下一个命令时,调试就停止了。这种方法有什么问题吗?有什么事情我需要注意吗?
为了更好地发挥想象力,这里是我的例子。我连接到NodeJS服务器,完成后,我发送一个请求并等待包含数据的响应,这些数据被处理后在下一个请求中再次发送到NodeJS server(Section1)。NodeJS给我最后的回应和程序工作。。。谢谢你的建议!
最后,我明白了,发生了什么。我知道,我没有显示我的原始代码,而是使用了某种伪代码,但如果有人感兴趣知道,问题可能是导致接收数据的错误转换。我有大小为1024的缓冲区和附加数据的StringBuilder
变量。因此,当我收到数据时,将其转换为:Encoding.UTF8.GetString(state.Buffer)
-这是错误的,相反,我不得不使用Encoding.UTF8.GetString(state.Buffer, 0, bytesRead)
。我不知道是怎么回事,但这部分代码造成了麻烦,并停止了回调执行。
在不了解实现详细信息的情况下,我会怀疑第二个_nodeJS.Send(...
调用被第一个Send调用的响应阻止了。
猜测一下,您的代码会做这样的事情(由伪代码组成!):
void Send(String data, Action<Response> callback)
{
_socket.BeginSend(Magic(data), r => {
callback.Invoke(r.ResponseData);
_socket.EndSend(r.Result); //you cannot call _socket.Send() again until you have done this!
});
}
由于操作顺序,它应该这样做:
void Send(String data, Action<Response> callback)
{
_socket.BeginSend(Magic(data), r => {
_socket.EndSend(r.Result);
callback.Invoke(r.ResponseData);
});
}