C# 为什么我的背景工人不工作?

C# 为什么我的背景工人不工作?,c#,.net,backgroundworker,tcplistener,C#,.net,Backgroundworker,Tcplistener,最近,我开始用tcp侦听器服务器和客户端制作一个简单的聊天程序。在服务器应用程序上,我决定将侦听器放在后台工作程序上,当我单击“启动服务器”按钮时,它会启动后台工作程序并开始侦听tcp客户端,但当我运行backgroundWorker1.RunWorkerAsync()函数时,它会跳过backgroundWorker1_DoWork()中的所有代码函数并直接转到backgroundWorker_RunWorkerCompleted()函数。由于我使用winforms builder,我让它自动为

最近,我开始用tcp侦听器服务器和客户端制作一个简单的聊天程序。在服务器应用程序上,我决定将侦听器放在后台工作程序上,当我单击“启动服务器”按钮时,它会启动后台工作程序并开始侦听tcp客户端,但当我运行backgroundWorker1.RunWorkerAsync()函数时,它会跳过backgroundWorker1_DoWork()中的所有代码函数并直接转到backgroundWorker_RunWorkerCompleted()函数。由于我使用winforms builder,我让它自动为我的函数生成事件处理程序,并检查它们是否正确,是否正确。老实说,我不知道该给你检查代码的哪一部分,所以有人知道我可以做些什么来修复它吗

以下是代码的一些部分:

message函数应该向服务器聊天室发送消息,这是我用于故障排除的主要功能,但它不发送消息

 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属性不是可选的。