话不多说直接进入主题,当我们在VS项目中生成一个窗体时,就默认开启了管理该窗体
包括控件的输入输出调用等等的UI进程,而且如果不进行干预该进程就是窗体应用程序的
主进程,在项目中所有的操作都会占用该进程。
可能你也会有这样的疑问:我们写的代码逻辑没有问题,源码中确实也执行了控件的相
关操作就算是占用主线程为什么等任务彻底结束后关于界面的操作才会有响应呢?因为
占用UI进程的操作带来的影响就是---UI进程锁定对界面的调用和访问!这就造成了常见
的假死、界面信息不能实时更新等一些问题。所以要解决这样的问题,提升用户的操作
体验需要采用多进程方式,顺便提一下,萌新在项目中使用到了listview控件,发现这
个控件在实时更新数据时会闪烁?非常不美观,结合网上大佬们给的方法在本文中也做
了描述和解决方案
一.异步操作
在这里本人推荐使用System.ComponentModel.BackgroundWorker类的实例来开启后台,
首先通常当我们使用System.Threading类的实例来实现我们的异步方法时容易造成不必
要的进程冲突BackgroundWorker类可以很好的协调冲突问题。其次,BackgroundWorker
类使用方便、简单、灵活最重要的是可操作性强大,基本上可以满足对多进程的需求。
奉上简单几个模板:
(1)如果你只想简单的后台你的任务;
(2)如果你想后台你的任务并在后台任务中实时访问界面控件;
(3)如果你想在主进程中实时关注后台任务的执行情况;
(4)如果你想在主进程中触发后台任务意外或正常结束后的新任务;
(5)如果你想随时取消后台任务;
(1)如果你只想简单的后台你的任务
//BackgroundWorker所在命名空间
using System.ComponentModel;
//这是某个你要后台的任务
public void Function()
{
}
//首先BackgroundWorker一个work
private BackgroundWorker work;
//然后定义一个委托,委托内是你要异步的任务、定义的参数等
private void ThreadEntrust(object sender,DoWorkEventArgs e)
{
Function();//你的任务
}
//最后封装BackgroundWorker的实例、挂载委托并开启后台进程的方法
private void ThreadStart()
{
work = new BackgroundWorker();
work.DoWork += new DoWorkEventHandler(ThreadEntrust);
work.RunWorkerAsync(); //新进程Start
}
//OK 现在可以调用ThreadStart()方法触发后台任务了,当然调用该方法后,UI进程会继续执行该方法之后的一系列任务