在WinForm中编程时,如果我们直接在主进程中进行计算的话就会直接卡死UI线程,这样的话用户体验会非常差,但是直接在后台运算的话由无法给用户一个直接的反馈。如何才能做到异步计算+前台刷新呢,有以下几种方法供大家参考。
一、直接屏蔽线程之间的检查
这是最偷懒的办法,因为C#会检查不同线程之间调用进程,默认状况下这种操作可能造成不安全现象,所以是被禁止的,诞生我们可以向init函数中添加一行代码解除限制。
Control.CheckForIllegalCrossThreadCalls = false;//取消线程间的安全检查
二、使用定时器
定时器可以实现一定时间允许特定代码,相当于轮询,我们可以通过在计时器中放置代码来做到后台运算+前台更新。
但是需要注意的是计时器如果触发过于频繁还是可能造成前台卡顿甚至无法移动(触发时间过短/定时器过多)
Timer tm = new Timer(); //初始化定时器
tm.Interval = 10; //定时器时间间隔
tm.Tick += Tm_Tick; //设置定时器触发事件
tm.Start(); //启动定时器
private void Tm_Tick(object sender, EventArgs e)
{
//需要执行的代码
tm.Stop(); //终止定时器
}
三、使用异步
此方法是最为便捷和安全的方法,很推荐大家使用
new Task(new Action(() =>
{
this.Invoke(new Action(() =>
{
//需要执行的代码
}));
})).Start();