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` 等。有内置的方法可以做到这一点。)

一种通用选项选项是仅使用Invoke

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

DisplayError然后可以包含针对这种情况的所有 UI 代码。请注意,通常最好将 UI 代码与业务逻辑分开。在整个应用程序中嵌入 UI 代码是不可取的。

于 2012-12-18T17:08:22.580 回答