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中的数据都暂停,进程被阻塞,只有方法结束后,才能正常工作,这是为什么?
展开
 我来答
百度网友154139e
2016-12-06 · TA获得超过413个赞
知道小有建树答主
回答量:295
采纳率:50%
帮助的人:251万
展开全部

肯定会卡住呀,因为你相当开了一个线程,调一个方法,而这个方法里面有一个循环,每次都会卡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。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式