.NET 中 多线程、并行总结

一、为了创建无阻塞应用程序,可以使用三种方式:

1.Thread 类型: 

  private void button1_Click(object sender, EventArgs e)
        {
            //使用Thread创建次线程执行后台任务
            Thread t1 = new Thread(() => { ProcessFiles(); });
            t1.Start();
        }

2.异步委托: 

  private void button1_Click(object sender, EventArgs e)
        {
         
            //使用异步委托
            Action a = ProcessFiles;
            IAsyncResult ar = a.BeginInvoke(null, null);

        }

3.使用 System.Threading.Tasks 命名空间中的类型简化操作,如:

  private void button1_Click(object sender, EventArgs e)
        {
            //使用Task类简化操作
            Task.Factory.StartNew(() => { ProcessFiles(); });
        }

 

二、使用 System.Threading.Tasks命名空间封装的并行操作方法

.NET 4中新增加的并行处理类型Parallel、Task,旨在封装复杂的多线程操作,运行时会自动判断是否使用需要多核进行处理(自动优化)。主要包括两方面:数据并行、任务并行

1.数据并行:

通过迭代集合或数据,调用方法,经测试当方法中的任务很简单时,并行效率不如串行操作。

        //数据同步执行
        private void button5_Click(object sender, EventArgs e)
        {
            DateTime time1 = DateTime.Now;

            for (int i = 0; i < 4; i++)
            {
                int a = 0;
                int b = i * 10000000;
                for (int j = 0; j < b; j++)
                {
                    a += j;
                }
            }
            DateTime time2 = DateTime.Now;
            TimeSpan ts = time2 - time1;
            MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
        }

        //数据并行
        private void button4_Click(object sender, EventArgs e)
        {
            DateTime time1 = DateTime.Now;

            Parallel.For(0, 4, (i) => {
                MessageBox.Show(string.Format("当前线程:{0}", Thread.CurrentThread.ManagedThreadId));
                int a = 0;
                int b = i * 10000000;
                for (int j = 0; j < b; j++)
                {
                    a += j;
                }
            });
        
            DateTime time2 = DateTime.Now;
            TimeSpan ts = time2 - time1;
            MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
        }

2.任务并行:

多个互不相干的操作可以尽量利用多核并行执行。

        //并行任务
        private void button2_Click(object sender, EventArgs e)
        {
            DateTime time1 = DateTime.Now;
            Parallel.Invoke(Task1, Task2);
           
            DateTime time2 = DateTime.Now;
            TimeSpan ts = time2 - time1;
            MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
        }

        //同步任务
        private void button3_Click(object sender, EventArgs e)
        {
            DateTime time1 = DateTime.Now;
            Task1();
            Task2();
            DateTime time2 = DateTime.Now;
            TimeSpan ts = time2 - time1;
            MessageBox.Show(string.Format("用时:{0}秒", ts.TotalSeconds));
        }

 

转载于:https://my.oschina.net/dyc1122/blog/884484

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值