0


私は奇妙な問題を抱えています。C# で記述されたプログラムに SocketIO4Net クライアントを使用しています。このプログラムは、NodeJS および SocketIO で記述されたサーバーと通信します。SocketIO4NET クライアントで「socket.emit()」および「socket.On()」メソッドを使用して、プログラムとサーバーの間でデータを送受信できます。ただし、サーバーから受信したデータで GUI のテキスト ボックスを更新しようとしても、何も起こりません。しかし、「MessageBox.Show()」メソッドを使用すると、受信したデータを表示できます。データを受信するために次のコードを使用しています。

public Form1()
    {
        InitializeComponent();
        socket = new Client("http://127.0.0.1:80/");
        socket.On("message", (data) =>
        {
             String msg = data.Json.Args[0].ToString();
             MessageBox.Show(msg,"Received Data");
             rxtxtbox.Text = msg;


        });
        socket.Connect();
    }

データ送信の場合:

 private void sendbtn_Click(object sender, EventArgs e)
    {
        String msg = msgtxtbox.Text.ToString();
        socket.Emit("private message", msg);
    }

上記のコードは正常に動作します。しかし、TextBox 'rxtxtbox' を更新していません。「rxtxtbox.Text = msg;」という行を移動すると 「MessageBox.Show();」の上にある場合、「メッセージ」イベントを受信して​​も何も起こりません。ブレークポイントを設定して、変数「msg」の値とその問題を監視してみました。テキストボックスを更新して「msg」を渡すためだけに別の関数を宣言しようとしましたが、まだ結果が得られません! これは「メッセージ」イベントの待機と関係があると思いますか? 「Application.DoEvents()」および「rxtxtbox.Refresh()」メソッドを試しましたが、まだ運がありません! 私はC#が初めてです。助けてください!

4

1 に答える 1

0

MessageBox.Show を rxtxtbox.Text の前に配置すると、ペイロード データが表示されますが、最初に rxtxtbox.Text を配置すると、何も起こりません。

socketIO4Net のイベント ハンドラーは間違いなくバックグラウンド スレッドで実行されるため、この非 UI スレッドから UI コントロールを更新する例外をスローしていると思います。MessageBox についての私の理解では、それは UI に関連付けられていないため、UI 以外のスレッドから問題なく呼び出すことができます。

rxtxtbox.Text = msg 行の代わりにこれを試してください:

rxtxtbox.Invoke(new Action(() => rxtxtbox.Text = msg)));

これは、ラムダ エクスプレスと呼ばれるものを使用して、コントロール (この場合はテキスト ボックス) の基になるハンドルを所有するスレッドで実行される匿名デリゲートを作成します。

Text プロパティを更新する直前にこの行を配置して検査することもできます (true の場合、実際に非 UI スレッドを使用しており、問題が見つかりました)。

bool state = rxtxtbox.InvokeRequired;

非 UI スレッドからの GUI の更新を処理するには、さまざまな方法があります。SO でマルチスレッドの winforms gui C# などを検索してください。socketio4net から発生したメッセージはすべて適切に処理する必要があります。そうしないと、UI スレッドの例外がスローされます。

于 2013-05-07T20:23:53.717 に答える