2

NodeJS サーバーとの基本的なやり取りを提供するクラスを作成しました。このクラスには TcpClient インスタンスも含まれており、非同期で動作するため (BeginRead、BeginWrite などのメソッド)、多くの関数がコールバック (ラムダ式を使用する匿名関数) を引数として受け取ります。問題はこのシナリオから始まります (オリジナルと同様の平和なコードについて説明しようとしています)。

this._nodeJS.Send("DATA_TO_SEND", (Response) => {
    Console.WriteLine(Response);

    // Section1
    this._nodeJS.Send("ANOTHER_DATA", (Response1) => {
        Console.WriteLine(Response1);
    });
});

Section1で問題が発生します。コメントアウトすると、プログラムは期待どおりに動作します。コンソールに書かれた応答が受信されます。コメントアウトされていない場合、非常に奇妙な動作を開始します。セクション 1 のコンソールへの書き込みは機能しません (多くの場合)。重要なことは、このセクションの Console.WriteLine の下のコードが実行されず、「スレッド」がコマンドの直前で停止することです。段階的にデバッグしようとしましたが、Section1 の変数が正しく設定されており、次のコマンドに到達すると、デバッグが停止します。このアプローチに問題はありますか?知っておくべきことがいくつかありますか?

想像力を高めるために、ここに私の例を示します。NodeJS サーバーに接続し、完了したらリクエストを送信し、データを含むレスポンスを待ちます。データは処理され、次のリクエストで NodeJS サーバーに再度送信されます (セクション 1)。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 呼び出しからの応答によって 2 番目の呼び出しがブロックされていると思われます。

推測では、コードは次のようになります (疑似コードを作成しました!)。

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 に答える