我正在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:
右侧窗体的进度条值每秒都在减少,而左侧窗体只减少一次,并且停留在那里。
我想知道为什么右边窗体上的进度条卡住了,我该怎么解决这个问题。
1条答案
按热度按时间jv2fixgn1#
在C#语言中,GUI操作应该由核心线程管理,如果用额外的线程改变控件,就会发生冲突。
方法。