使用c#,我想做一个循环,它只在完成之前的函数之后重复任务。这是我的代码
TcpListener serv = new TcpListener(IPAddress.Any, 19148);
serv.Start();
TcpClient clie = serv.AcceptTcpClient();
NetworkStream stre = clie.GetStream();
byte[] buffer = new byte[2048];
Form1 f1 = new Form1();
f1.Show();
f1.TopMost = true;
///the code to repeat starts here
stre.Write(Encoding.UTF8.GetBytes("Enter Message: "), 0, Encoding.UTF8.GetByteCount("Enter Message: "));
stre.Read(buffer, 0, buffer.Length);
f1.label1.Text = Encoding.UTF8.GetString(buffer);
///ends here
我已经读过循环,但每次使用它都会导致程序崩溃。
我已经尝试过大多数事情,但到目前为止最有希望的是这个,但它只显示最后输入的形式。
int i = 0;
while(i < 3)
{
stre.Write(Encoding.UTF8.GetBytes("Enter Message: "), 0, Encoding.UTF8.GetByteCount("Enter Message: "));
stre.Read(buffer, 0, buffer.Length);
f1.label1.Text = Encoding.UTF8.GetString(buffer);
i++;
}
任何帮助都会受到赞赏,因为我没有任何线索甚至指向正确的方向。
答案 0 :(得分:1)
你真的需要将读取移动到它自己的线程(或使用异步方法)。您在表单上调用了.Show
,但实际的节目不是即时的,它需要您用于输入的线程才能绘制自己。如果您绝对无法将读取循环移动到另一个线程(Async,BackgroundWorker,Task等),则可以将代码更改为以下内容:
TcpListener serv = new TcpListener(IPAddress.Any, 19148);
serv.Start();
TcpClient clie = serv.AcceptTcpClient();
NetworkStream stre = clie.GetStream();
byte[] buffer = new byte[2048];
Form1 f1 = new Form1();
f1.Show();
f1.Refresh(); // Do it RIGHT NOW!
f1.TopMost = true;
int i = 0;
while(i < 3)
{
stre.Write(Encoding.UTF8.GetBytes("Enter Message: "), 0, Encoding.UTF8.GetByteCount("Enter Message: "));
stre.Read(buffer, 0, buffer.Length);
f1.label1.Text = Encoding.UTF8.GetString(buffer);
f1.label1.Refresh(); // Do it right now!
i++;
}
您会发现您的表单会显示,但它绝对是冻结的。你不能调整它的大小,它会在你的循环完成之前重新绘制。不是很好的经历。