让代码更简单

C#线程与委托的简单使用

重要:本文最后更新于2018-01-22 12:53:53,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

线程在程序应用中是非常重要的,要知道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这个类其实是对线程的简单包装,有了它,就可以方便的调用线程方法。不过线程的使用也就那么几句话,这样写也是多此一举,大牛绕路。

效果图:

C#线程与委托的简单使用

C#线程与委托的简单使用

感觉很棒!可以赞赏支持我哟~

11 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐