代表回调的C#奇怪行为

时间:2013-02-08 15:30:14

标签: c# delegates lambda callback

我写了一个类,它应该提供与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);
    });
});

第1节中出现问题。当它被注释掉时,程序按预期运行。收到响应并写入Console。当它没有被注释掉时,它开始表现得非常奇怪。在Section1中写入控制台不起作用(在很多情况下),重要的是,本节中Console.WriteLine下面的代码没有执行,“thread”在命令之前就停止了。我尝试调试它,一步一步,第1节中的变量被正确设置,当我到达下一个命令时,调试就停止了。这种方法有什么问题吗?我需要注意一些事情吗?

为了更好的想象,这是我的榜样。我连接到NodeJS服务器,完成后,我发送请求并等待包含数据的响应,这些数据在下一个请求中被处理并再次发送到NodeJS服务器(第1节)。 NodeJS给我最终答复和程序工作......感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在不知道您的实施细节的情况下,我怀疑第一个发送呼叫的响应阻止了第二个_nodeJS.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);
    });
}