C#中开定时器并同时处理其他任务
privatevoidtimer1_Tick(objectsender,EventArgse)//定时器功能{nowtimelab.Text=DateTime.Now.T...
private void timer1_Tick(object sender, EventArgs e) //定时器功能
{
nowtimelab.Text = DateTime.Now.ToString(); //不断刷新时间到label中
}
Thread t;
private void button4_Click(object sender, EventArgs e) //点击按钮开启新进程
{
i = 0;
t = new Thread(new ThreadStart(Theadop));
t.Start();
}
private delegate void medtime();
public void Theadop()
{
medtime d = new medtime(sumtime);
this.Invoke(d);
}
public void sumtime() //将计数显示在label中。
{
for (int j = 0;j<100000;j++ )
{
i++;
Thread.Sleep(100);
sumlab.Text = i.ToString();
}
}
运行结果是两个label中的数据都暂停,进程被阻塞,只有方法结束后,才能正常工作,这是为什么? 展开
{
nowtimelab.Text = DateTime.Now.ToString(); //不断刷新时间到label中
}
Thread t;
private void button4_Click(object sender, EventArgs e) //点击按钮开启新进程
{
i = 0;
t = new Thread(new ThreadStart(Theadop));
t.Start();
}
private delegate void medtime();
public void Theadop()
{
medtime d = new medtime(sumtime);
this.Invoke(d);
}
public void sumtime() //将计数显示在label中。
{
for (int j = 0;j<100000;j++ )
{
i++;
Thread.Sleep(100);
sumlab.Text = i.ToString();
}
}
运行结果是两个label中的数据都暂停,进程被阻塞,只有方法结束后,才能正常工作,这是为什么? 展开
1个回答
展开全部
肯定会卡住呀,因为你相当开了一个线程,调一个方法,而这个方法里面有一个循环,每次都会卡100,Sleep是挂起呀,把当前这个线程挂起,简单的说,你这个线程会一直挂到循环结束,其他的线程才动。
public void sumtime() //将计数显示在label中。
{
for (int j = 0; j < 100000; j++)
{
i++;
//Thread.Sleep(100);
sumlab.Text = i.ToString();
int start = Environment.TickCount;
while (Math.Abs(Environment.TickCount - start) < 1000)
{
Application.DoEvents(); //消息可以继续用。
}
}
}
建立不要直接在循环中挂Sleep,除非有必要,这样会造成循环语句阻塞,多线程最怕这个。你如果非要搞两个线程,最好开两个Timer。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询