我正在尝试为学校项目创建服务器/客户端应用程序。
我在给定端口上有一台服务器,连接了多个用户,每个用户都有自己的用户名。
现在我想检查尝试连接的用户是否使用有效的用户名。例如,如果已经连接了具有用户名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
上的跨线程操作。
答案 0 :(得分:4)
您只能从UI线程访问UI元素。如果您尝试从后台线程访问它们,您将获得此异常。此代码需要在后台线程中运行,以便您不会永久阻止UI线程并冻结您的应用程序。
有几种方法可以编组回UI线程,其中一部分取决于您决定首先启动后台线程的方式。 (如果你正在使用BackgroundWorker, Tasks,
await`等,那么就有内置的方法。)
一个通用选项是仅使用Invoke
:
if (errorCode == "user exists")
{
this.Invoke(new Action(()=> { DisplayError(); } ));
}
然后, DisplayError
可以包含针对此情况的所有UI代码。请注意,通常最好将UI代码与业务逻辑分开。在整个应用程序中嵌入UI代码是不可取的。