求从线程执行一个很长的Thread.Sleep()UI线程又不卡死的办法

a091003040421 2014-08-05 08:43:29
namespace WindowsFormsApplication1
{


public partial class Form1 : Form
{
private delegate void MyDelegate();
int num = 0;
Thread t1;
public Form1()
{
InitializeComponent();

}
private void button1_Click(object sender, EventArgs e)
{
t1 = new Thread(SetText);
t1.IsBackground = true;
t1.Start();
}

private void SetText()
{
MyDelegate d1 = StartDelegate;
while (true)
{
textBox1.Invoke(d1);
}
}
void StartDelegate()
{
//textBox1.Text = num++.ToString();
Thread.Sleep(10000);
}

private void button2_Click(object sender, EventArgs e)
{
t1.Suspend();
}
}
}
...全文
237 点赞 收藏 6
写回复
6 条回复
风吹腚腚凉 2014年08月07日
引用 3 楼 Z65443344 的回复:
Thread.Sleep(10000); 写到while里面,而不要写到委托里面 写到委托里,委托是主线程去调用,相当于主线程sleep
真相
回复 点赞
风吹腚腚凉 2014年08月07日
引用 2 楼 caozhy 的回复:
之所以死,是因为 while (true) { textBox1.Invoke(d1); } 在主线程写这个当然死。 另外 t1.Suspend(); 不要这么写,停止或者挂起线程让线程自己做。
纠正一下 textBox1.Invoke(d1); 这句是在主线程运行的,而不是 while (true) { textBox1.Invoke(d1); } 在主线程与行的。
回复 点赞
effun 2014年08月07日
用Timer吧
回复 点赞
於黾 2014年08月07日
Thread.Sleep(10000); 写到while里面,而不要写到委托里面 写到委托里,委托是主线程去调用,相当于主线程sleep
回复 点赞
之所以死,是因为 while (true) { textBox1.Invoke(d1); } 在主线程写这个当然死。 另外 t1.Suspend(); 不要这么写,停止或者挂起线程让线程自己做。
回复 点赞
tanta 2014年08月05日
把sleep的地方改为 DateTime lastTime = DateTime.Now; DateTime currTime = lastTime; while ((currTime - lastTime).Ticks < 10000) { Application.DoEvents(); }
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告