HTML5技术

C# 多线程,论多核时代爱恨情仇 - 请叫我头头哥

字号+ 作者:H5之家 来源:博客园 2015-11-24 08:03 我要评论( )

为什么要学习多线程? 下面通过一些实例来认识一下多线程和让大家知道为什么要学习多线程。 v 写在前面 老板只有两种,好的和坏的。好的老板只跟你谈钱,坏的老板只跟你谈理想。 v 模拟场景 假设后台有个monitor时事的在监测订单,且可以发现订单然后处理订

为什么要学习多线程?

下面通过一些实例来认识一下多线程和让大家知道为什么要学习多线程。

C# 多线程

v写在前面

老板只有两种,好的和坏的。好的老板只跟你谈钱,坏的老板只跟你谈理想。

v模拟场景

假设后台有个monitor时事的在监测订单,且可以发现订单然后处理订单,每次(1次/S)可以处理1千个订单,需要向仓库系统发出指令,让他们负责配送发货。那么我们来写一个EmulationSystem(模拟系统)

C# 多线程

JobHelper因为我们只是为了模拟一个环境,所以它是这样的。

//------------------------------------------------------------------------------ // <copyright file="JobHelper.cs" company="CNBlogs Corporation" owner="请叫我头头哥"> // Copyright (C) 2015-2016 All Rights Reserved </copyright> CNBlogs.Common.Shared { using System.Threading; Job helper JobHelper { Get job total count GetJobCount() { ; } Submit job SubmitJob(int jobId) { // 假设针对每个订单向后台发送任务需要1秒,而且每个订单都能成功发送 Thread.Sleep(1000); return true; } } }

背景我们也交待完了,现在需要来得到这些订单信息以后,向仓库submit这些订单。

v实战演习

根据这种背景,我们可以有很多处理的办法。

  • 传统办法:

    (开启无脑模式:未使用多线程)

    代码正文:

    //------------------------------------------------------------------------------ // <copyright file="Runner.cs" company="CNBlogs Corporation" owner="请叫我头头哥"> // Copyright (C) 2015-2016 All Rights Reserved </copyright> CNBlogs.EmulationSystem { using System; using System.Threading; using CNBlogs.Common.Shared; class Runner { Job helper JobHelper jobHelper = new JobHelper(); Runner lock Mutex mutex; static void Main(string[] args) { // 记录开始处理的时间 DateTime paddingTime = DateTime.Now.ToLocalTime(); int orderCount = jobHelper.GetJobCount(); // 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。 // 当前进程只能启动一次 mutex = ); if (!mutex.WaitOne(0, false)) { Console.Out.WriteLine(); return; } for (int i = 0; i < orderCount; i++) { // 假设i就是job id jobHelper.SubmitJob(i); } // 记录处理完成的时间 DateTime completeTime = DateTime.Now.ToLocalTime(); var minutes = (completeTime - paddingTime).TotalSeconds; Console.WriteLine(, orderCount, minutes)); } } }

    代码效果:

    PS:现在的这些个电商,动不动来个什么周年庆店庆什么双11双12的一顿突突,搞得咱这些老百姓就全部蜂拥而上,显然如果用传统的方法虽然不会出错,但是老板肯定会找你喝茶。在多核时代用这种方法也只能恨铁不成钢了。所以这个方法是绝对不可取的。

  • Task方法:

    如果有对Task不是很熟悉的园友可以在解开心谜。

    代码正文:

    //------------------------------------------------------------------------------ // <copyright file="Runner.cs" company="CNBlogs Corporation" owner="请叫我头头哥"> // Copyright (C) 2015-2016 All Rights Reserved </copyright> CNBlogs.EmulationSystem { using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using CNBlogs.Common.Shared; class Runner { Job helper JobHelper jobHelper = new JobHelper(); Runner lock Mutex mutex; static void Main(string[] args) { // 记录开始处理的时间 DateTime paddingTime = DateTime.Now.ToLocalTime(); int orderCount = jobHelper.GetJobCount(); // 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。 // 当前进程只能启动一次 mutex = ); if (!mutex.WaitOne(0, false)) { Console.Out.WriteLine(); return; } var taskList = new List<Task>(); for (int i = 0; i < orderCount; i++) {
    int temp=i; taskList.Add(Task.Factory.StartNew(()
    => { // 假设i就是job id jobHelper.SubmitJob(temp); })); } // 等待所有task执行完毕 Task.WaitAll(taskList.ToArray()); // 记录处理完成的时间 DateTime completeTime = DateTime.Now.ToLocalTime(); var minutes = (completeTime - paddingTime).TotalSeconds; Console.WriteLine(, orderCount, minutes)); } } }

    代码效果:

    C# 多线程

     

  • 1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • HTML5新特性-多线程(Worker SharedWorker) - 大~熊

      HTML5新特性-多线程(Worker SharedWorker) - 大~熊

      2017-04-18 11:01

    • web workers工作线程 - Aqiaoba

      web workers工作线程 - Aqiaoba

      2017-03-10 15:00

    • https时代来了,你却还一无所知? - 茄果

      https时代来了,你却还一无所知? - 茄果

      2017-01-14 11:00

    • Web Worker javascript多线程编程(一) - PeakLeo

      Web Worker javascript多线程编程(一) - PeakLeo

      2016-12-27 10:00

    网友点评
    c