2

我写了一个类,它应该提供与 NodeJS 服务器的基本交互。此类还包括 TcpClient 实例并异步工作(例如 BeginRead、BeginWrite 等方法),因此许多函数将回调(使用 lambda expr. 的匿名函数)作为参数。问题在这种情况下开始(我试图说明类似于原始代码的和平)。

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 服务器,完成后,我发送一个请求并等待包含数据的响应,这些数据经过处理并在下一个请求(第 1 节)中再次发送到 NodeJS 服务器。NodeJS 给了我最终的回应和程序的工作......感谢您的任何建议!

4

2 回答 2

1

最后,我想通了,这是怎么回事。我知道,我没有显示我的原始代码,而是使用了某种伪代码,但如果有人有兴趣知道,问题可能是导致接收数据的错误转换。我有大小为 1024 的缓冲区和StringBuilder附加数据的变量。所以当我收到数据时,以这种方式转换它:Encoding.UTF8.GetString(state.Buffer)- 这是错误的,相反,我不得不使用Encoding.UTF8.GetString(state.Buffer, 0, bytesRead). 我不知道怎么做,但这部分代码造成了麻烦并停止了回调执行。

于 2013-02-10T19:39:07.153 回答
0

在不知道您的实现细节的情况下,我怀疑第二个_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);
    });
}
于 2013-02-08T15:42:40.113 回答