委托和多线程的理解

来源:互联网 发布:淘宝复制链接不弹出来 编辑:程序博客网 时间:2024/06/13 07:03

原始线:Thread

用法: Thread thread=new Thread(new ThreadStart(执行方法));

            thread.Priority = ThreadPriority.BelowNormal;

            thread.start();

           或者:

         Thread thread=  new Thread(new ParameterizedThreadStart(执行方法)) ;   

          thread.Priority = ThreadPriority.BelowNormal;

          thread.start();


讲解:Priority设置线程的优先级,start开启线程。ThreadStart不带参数的方法,ParameterizedThreadStart带一object参数的方法。

此种方法不推荐使用,创建多线的时候如果手动.Abort()的话,如果此线程正在执行状态中,强制关闭则会抛出异常。还用可能会把主线程也给卡死。


进阶线程:Task

         Task task=new   Task.Factory.StartNew(()=>{ 

           要执行的方法

          });

         task.Result;


讲解:Task和thread本身没有多大区别,无非就是语法的不同摆了,Task的方式也就是相当于创建了一个新的线程,task.Result等待这个线程执行完返回的结果。

   

高手进阶篇:委托的异步线程

private delegate void FlushClient(参数1,参数2,参数3);

FlushClient flush=new FlushClient(要执行的方法参数与委托参数相同);

flush.BeginInvoke(参数1,参数2,参数3,执行的回调函数,object);

实例:        

        private delegate void FlushClient(Action action,int timers);//代理
        public bool duge = false;
        public void ExecutiveThreedStart(Action action, int timers)
        {
            FlushClient fc = new FlushClient(ThreadFunction);
           // threed = new Thread();
            fc.BeginInvoke(action,timers, null, null);
        }


        private void ThreadFunction(Action action, int timers)
        {
            while (duge)
            {
                action();
                Thread.Sleep(timers * 1000);
            }
        }

讲解:BeginInvoke表示的是异步执行这个委托。

三种方式其实都是异步线程,何为异步线程就是在程序的主线程之外在创建一个子线程执行,线程之间执行相互不想干,主线程并不需要要等待子线程的执行,就是相当于跑步比赛一样,各个赛道中的人同时进行奔跑。多线程概念之中还有一个同步线程,其实就是将多个线程包装成一个模块,依次执行,就相当于有很多条赛道,第一条赛道中的人跑完,第二条赛道中的人继续奔跑,依次执行。本人还没有还没有用过同步线程,一开始觉得为何要有同步线程这个东西呢?为何不用单线程呢?其实任何一件产品被人广泛的使用都有它一定的道理,后来经过大脑一思考,终于被我想到了。如果我们创建了过多的异步线程是不是会造成服务器的开销很大呢?创建的线程大于了服务器的开销,反而会导致线程的之间的切换过于的平凡,反而会降低程序运行的效率,有可能还会导致出现异常,这样的话使用多线程是不是没有意义了呢?这个之后我们是不是可以采用同步线程来管理异步线程呢?当然以上只是我个人的观点,并没有经过实际的验证。

0 0
原创粉丝点击