线程在程序应用中是非常重要的,要知道UI线程是不能被长时间阻塞的,为了保证UI的流畅性,很多好使长的任务,我们都会交给线程或者异步任务来完成。线程在程序中几乎无所不在,学会它有助于我们更好的写代码。
在我们写程序时,大家会发现,有时候单单使用线程是不够的,还需要配合委托或者事件来实现我们想要的功能,比如在子线程中处理任务,再更新数据到UI。下面我们就来试试线程与委托的配合使用。
前景:
点击窗口中按钮,启动线程做加法运算,每秒加一,并将结果显示在label上。在程序运行过程中用户可以任意拖动界面,不出现卡顿现象。题目很简单,不使用线程一样可以实现,既然将到线程我们就用线程来实现。
线程类class1代码:
public delegate void settext(String str);//定义一个用于更新UI的委托,需要传入一个字符串参数 public delegate void threadmethod();//定义一个用于传入线程所运行的方法的委托,不需要参数 class Class1 { Control constr;//线程依赖对象,一般为窗体上下文 settext mymethod; //线程更新UI的方法,可以通过参数让用户自定义 //第一个窗体上下文,直接传this即可,第二个更新UI的方法名,第三个线程执行的方法名 public void runthread ( Control con, settext menthod ,threadmethod method){ constr = con; mymethod = menthod; Thread thread = new Thread ( new ThreadStart ( method ) ); thread.IsBackground = true; thread.Start (); } }
Form1窗口代码:
private void button1_Click ( object sender, EventArgs e ) { //非静态方法,实例化 Class1 mytest = new Class1 (); mytest.runthread (this,getstr,add); } public void add ()//线程需要执行的方法 { int i = 0; settext settx = new settext ( getstr ); while (true) { i++; Invoke ( settx, i.ToString () ); Thread.Sleep ( 1000 ); } } public void getstr (String str)//更新UI方法 { this.label1.Text = str; }
点击按钮就会使label中的数字每秒增加1,并且在此过程中,可以随意拖拉窗体,不会出现卡顿现象。可能初学者会觉得上面的代码有点复杂了,确实是这样,有点基础的朋友就会发现,上面的Class1这个类其实是对线程的简单包装,有了它,就可以方便的调用线程方法。不过线程的使用也就那么几句话,这样写也是多此一举,大牛绕路。
效果图:
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241265.html