为什么要学习多线程?
下面通过一些实例来认识一下多线程和让大家知道为什么要学习多线程。
老板只有两种,好的和坏的。好的老板只跟你谈钱,坏的老板只跟你谈理想。
v模拟场景假设后台有个monitor时事的在监测订单,且可以发现订单然后处理订单,每次(1次/S)可以处理1千个订单,需要向仓库系统发出指令,让他们负责配送发货。那么我们来写一个EmulationSystem(模拟系统)
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不是很熟悉的园友可以在解开心谜。
代码正文:
//------------------------------------------------------------------------------
// <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));
}
}
}
代码效果: