winforms 计时器在C#中的简单UDP聊天应用程序中不工作

lb3vh1jj  于 2022-12-23  发布在  C#
关注(0)|答案(1)|浏览(174)

我正在C#winforms上使用udp编写一个简单的聊天应用程序。
规则:
1.收到消息后,您有10秒的时间回复。
1.在发布回复后,其他用户有10秒的时间回复。
1.发送方提供控制,OtherPeopleTimer计算时间并每秒将进度条值减少10(发送方侧的进度条),如果时间耗尽,将运行惩罚方法。
1.在接收端,OursTimer每秒将进度值减少10,仅用于提供信息,并在时间用完时停止,不执行任何操作。
通过运行相同的程序exe,它将作为localhost在同一台计算机上运行。
Thread负责侦听传入的数据包并将传入的字符串发送到ProcessIncomingData函数。
但是,计时器无法正常工作(您可以在进度条上跟踪此情况)。例如,当第一个exe发送消息时,第二个exe上的进度条只减少一次,而它应该运行到进度条值为0为止。
这个问题的原因是什么,如何解决?
代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        IPAddress ServerIP;
        int ServerPort;
        IPEndPoint ServerEndPoint;
        Socket ServerSocket;

        IPAddress ClientIP;
        int ClientPort;
        IPEndPoint ClientEndPoint;

        Thread Listener;

        private void Form1_Load(object sender, EventArgs e)
        {
            OursTimer.Interval= 1000;
            OtherPeopleTimer.Interval= 1000;
            OursTimer.Enabled = false;
            OtherPeopleTimer.Enabled = false;

            ClientIP = IPAddress.Parse("127.0.0.1");
            ClientPort = 20000;
            ClientEndPoint = new IPEndPoint(ClientIP, ClientPort);

            ServerIP = IPAddress.Parse("127.0.0.1");
            ServerPort = 10000;
            ServerEndPoint = new IPEndPoint(ServerIP, ServerPort);

            ServerSocket = new Socket(SocketType.Dgram, ProtocolType.Udp);

            try
            {
                ServerSocket.Bind(ServerEndPoint);
            }
            catch (Exception)
            {
                ServerPort = 20000;
                ServerEndPoint = new IPEndPoint(ServerIP, ServerPort);
                ServerSocket.Bind(ServerEndPoint);
                ClientPort = 10000;
            }

            Listener = new Thread(Listen);
            Listener.Start();

        }
        public void Listen()
        {
            while (true)
            {
                byte[] buffer = new byte[1024];
                ServerSocket.Receive(buffer);

                string incomingMessage = Encoding.UTF8.GetString(buffer);
                incomingMessage = incomingMessage.Substring(0, incomingMessage.IndexOf("\0"));

                ProcessIncomingData(incomingMessage);
            }
            
        }
        public void ProcessIncomingData(string message)
        {
            OtherPeopleTimer.Stop();
            progressBar1.Value = 100;
            OursTimer.Start();
            MessageBox.Show(message);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            OursTimer.Stop();
            byte[] buffer = Encoding.UTF8.GetBytes(textBox1.Text);
            ServerSocket.SendTo(buffer, ClientEndPoint);
            progressBar1.Value = 100;
            OtherPeopleTimer.Start();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Environment.Exit(0);
        }
        private void OursTimer_Tick(object sender, EventArgs e)
        {
            if (progressBar1.Value > 0)
                progressBar1.Value -= 10;
            else
                OursTimer.Stop();
        }

        private void OtherPeople_Tick(object sender, EventArgs e)
        {
            if (progressBar1.Value > 0)
                progressBar1.Value -= 10;
            else
                OtherPeopleTimer.Stop();
        }
    }
}

Output:
右侧窗体的进度条值每秒都在减少,而左侧窗体只减少一次,并且停留在那里。
我想知道为什么右边窗体上的进度条卡住了,我该怎么解决这个问题。

jv2fixgn

jv2fixgn1#

在C#语言中,GUI操作应该由核心线程管理,如果用额外的线程改变控件,就会发生冲突。

this.Invoke((MethodInvoker)delegate
            {
                //code
            });

方法。

相关问题