0

学校のプロジェクト用にサーバー/クライアント アプリケーションを作成しようとしています。

特定のポートにサーバーがあり、複数のユーザーが接続されており、各ユーザーには独自のユーザー名があります。

接続しようとするユーザーが有効なユーザー名を使用しているかどうかを確認したいと思います。たとえば、ユーザー名 A を持つユーザーが既に接続されている場合、接続を希望する新しいユーザーはユーザー名 A を使用できません。

これが発生すると、サーバーは新しいクライアントにエラー コードで応答します。

この部分のコードは次のとおりです。

   private void Receive()
    {
        while (true)
        {
            byte[] buffer = new byte[64];
            socket.Receive(buffer);
            string received = Encoding.Default.GetString(buffer);
            if (received.IndexOf("!error") != -1)
            {
                string[] mySplit = received.Split(':');
                string errorCode = mySplit[1].Trim((char)0);
                if (errorCode == "user exists")
                {
                    richTextBox1.AppendText("Your connection was refused by server, because there's already another user connected with the username you choose");
                    socket.Disconnect(true);

                    connectBtn.Enabled = true;
                }
            }
        }
    }

これを実行しようとすると、プログラムがクラッシュし、Visual Studio から に無効なクロススレッド操作があると表示されrichTextBox1ます。

4

1 に答える 1

4

UI スレッドからのみ UI 要素にアクセスできます。バックグラウンド スレッドからアクセスしようとすると、この例外が発生します。このコードは、UI スレッドを永久にブロックしてアプリケーションをフリーズさせないように、バックグラウンド スレッドで実行する必要があります。

UI スレッドにマーシャリングする方法はいくつかありますが、その一部は、最初にバックグラウンド スレッドをどのように開始したかによって異なります。( BackgroundWorker, Tasks,await などを使用している場合は、これを行う方法が組み込まれています。)

1 つの汎用オプション オプションは、次のように使用することInvokeです。

if (errorCode == "user exists")
{
    this.Invoke(new Action(()=> { DisplayError(); } ));
}

DisplayErrorその後、この状況のすべての UI コードを含めることができます。一般に、UI コードをビジネス ロジックから分離するのが最善であることに注意してください。アプリケーション全体に UI コードを埋め込むことは望ましくありません。

于 2012-12-18T17:08:22.580 に答える