首页 > 编程语言 > 详细

C# 多线程(一)

时间:2017-02-22 19:26:54      阅读:137      评论:0      收藏:0      [点我收藏+]

一直没有系统学习过C# 的多线程,今天跑一个图片迁移的小程序时,发现速度奇慢,想着要是改成多线程的应该就会好很多,但是改造过程总是出现奇奇怪怪的错误,怪只怪基础没打好,下决心要从基础开始了解多线程。

1.多线程实现方式

private void btnThreadTest_Click(object sender, EventArgs e)
        {
            try
            {
          
               // CreatThreadByNewThread();
               // CreatThreadByThreadPool();
                CreatThreadByTask();
                CreatThreadByDelegate();
                for (var i = 0; i < 10000; i++)
                {                  
                    Console.Write(i + "x");
                }
              
            }
            catch (Exception)
            {

                throw;
            }
        }

 /// <summary>
        /// 直接new一个Thread
        /// </summary>
        public void CreatThreadByNewThread() {
            try
            {
                //1.直接new一个新线程
                //Thread firstThread = new Thread(new ThreadStart(ThreadTest1));//无参线程
                Thread firstThread = new Thread(new ParameterizedThreadStart(ThreadTest1));
                firstThread.Start("线程参数");
                firstThread.Join();//同下文中task的wait
                Thread.Sleep(1);//暂停当前线程一段时间,单位微秒 ,Thread.Sleep(0)立即放弃这个线程的时间片,主动交出CPU给其他线程           
            }
            catch (Exception)
            {

                throw;
            }
        }
        //使用线程池
        public void CreatThreadByThreadPool() {
            try
            {
                //2.线程池
                ThreadPool.UnsafeQueueUserWorkItem(ThreadTest1, "线程参数");
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// 使用task
        /// </summary>
        public void CreatThreadByTask()
        {
            try
            {
                //3.task执行
                Task<int> t1 = new Task<int>(n => ThreadTest2((object)n), "线程参数");
                t1.Start();
                t1.Wait();//等待线程执行完成                
                Task tend = t1.ContinueWith(task => Console.WriteLine("Thread result is {0}", t1.Result));

            }
            catch (Exception)
            {

                throw;
            }
        }

        //使用委托异步执行
        public void CreatThreadByDelegate() {
            try
            {
                //4. 委托异步执行
                MyDelegate mydelegate = new MyDelegate(ThreadTest2);
                IAsyncResult result = mydelegate.BeginInvoke("线程执行参数", ThreadCallback, "线程回调参数");//线程执行完成后自动执行的回调函数
                int resstr = mydelegate.EndInvoke(result);//会等待线程执行完成后执行
                Console.WriteLine("Thread result is {0}", resstr);
            }
            catch (Exception)
            {

                throw;
            }
        }

  

2.多线程数据安全。

  对于多线程共享的数据,且有线程对共享数据存在写操作时,需要添加独占锁,lock,将线程对改共享数据操作部分加锁,下面中done就是共享数据

static readonly object locker = new object();
 lock (locker)
        {
             if (!done)
             {
                Console.WriteLine("Done");
                done = true;
             }
       }

  当某一个线程访问独占锁时,其他线程会阻塞等待,独占锁的释放,

 

参考文章:http://www.cnblogs.com/jackson0714/p/5100372.html

     http://www.cnblogs.com/luxiaoxun/p/3280146.html

C# 多线程(一)

原文:http://www.cnblogs.com/huanglin101/p/6430102.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!