这个程序在线程中写入1到5000的数字,但主要形式仍然冻结。 哪里出错?提前致谢。
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int how, current;
bool job;
Object lockobj = new Object();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Started!");
how = 5000;
current = 0;
job = true;
Thread worker = new Thread(Go);
worker.Name = "1";
worker.Start();
}
private void Go()
{
while (job)
{
if (current < how)
{
lock (lockobj)
{
current++;
}
log(string.Format("Thread #{0}: {1}", Thread.CurrentThread.Name, current));
}
else
{
job = false;
}
}
}
private void log(string text)
{
Action A = new Action(() =>
{
richTextBox1.AppendText(text + System.Environment.NewLine);
});
if (richTextBox1.InvokeRequired)
this.BeginInvoke(A);
else A();
}
}
}
答案 0 :(得分:3)
它冻结是因为您在文本框上快速渲染并且GUI没有时间保持同步。请记住,此呈现发生在主GUI线程上,并通过调用BeginInvoke
来更新文本框,因此实际上会消耗此主GUI线程的所有资源。尝试降低记录的频率以避免此行为。
答案 1 :(得分:3)
因为你的大部分工作都将花在
上 if (richTextBox1.InvokeRequired)
this.BeginInvoke(A);
当您调用表单时,它会被锁定。
做一些真正的工作,比如Thread.Sleep(1000);
:-),而不是current++;
,你的表单会在更新之间做出回应。