C# 为什么我的背景工人不工作?
最近,我开始用tcp侦听器服务器和客户端制作一个简单的聊天程序。在服务器应用程序上,我决定将侦听器放在后台工作程序上,当我单击“启动服务器”按钮时,它会启动后台工作程序并开始侦听tcp客户端,但当我运行backgroundWorker1.RunWorkerAsync()函数时,它会跳过backgroundWorker1_DoWork()中的所有代码函数并直接转到backgroundWorker_RunWorkerCompleted()函数。由于我使用winforms builder,我让它自动为我的函数生成事件处理程序,并检查它们是否正确,是否正确。老实说,我不知道该给你检查代码的哪一部分,所以有人知道我可以做些什么来修复它吗 以下是代码的一些部分: message函数应该向服务器聊天室发送消息,这是我用于故障排除的主要功能,但它不发送消息C# 为什么我的背景工人不工作?,c#,.net,backgroundworker,tcplistener,C#,.net,Backgroundworker,Tcplistener,最近,我开始用tcp侦听器服务器和客户端制作一个简单的聊天程序。在服务器应用程序上,我决定将侦听器放在后台工作程序上,当我单击“启动服务器”按钮时,它会启动后台工作程序并开始侦听tcp客户端,但当我运行backgroundWorker1.RunWorkerAsync()函数时,它会跳过backgroundWorker1_DoWork()中的所有代码函数并直接转到backgroundWorker_RunWorkerCompleted()函数。由于我使用winforms builder,我让它自动为
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int port = Convert.ToInt32(txtPort.Text);
IPAddress ipaddr = IPAddress.Parse("127.0.0.1");
server = new TcpListener(ipaddr, port);
server.Start();
Byte[] bytes = new Byte[256];
String data;
message("Server started!", 2);
while (true)
{
TcpClient client = server.AcceptTcpClient();
data = null;
NetworkStream stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
}
}
}
这部分代码意味着在侦听器停止时运行,这也意味着服务器停止
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
message("Server stopped!", 2);
}
这些是我的CServer设计器类中自动生成的事件处理程序
//
// backgroundWorker1
//
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
这是我的“启动服务器”按钮的代码。函数的作用是将服务器状态变量设置为true
startServerToolStripMenuItem.Text = "Stop server";
message("Starting server at 127.0.0.1:" + txtPort.Text, 2);
lserver.Start();
backgroundWorker1.RunWorkerAsync();
这是我点击“启动服务器”按钮时聊天室的截图
while(true)阻止
backgroundWorker1\u DoWork
完成。我知道我会将其更改为适合我的应用程序的不同变量,但我的主要问题是为什么它会跳过backgroundWorker1\u DoWork函数中的代码。我也在没有while循环的情况下尝试了它,但仍然不起作用。如果不在后台运行它,调试会更容易:backgroundWorker1\u DoWork(null,null)代码>您正在访问后台工作线程中的UI-鉴于重点是在非UI线程中工作,而您不应该在其他线程中访问UI,您需要避免这样做。检查RunWorkerCompleted事件处理程序中的e.Error属性不是可选的。