相信分别从有TASK和没有TASK的这两次demo中,可以清楚的发现多线程处理这些频繁交互能力的魅力。你会爱上这个方法。确实提高的效率。但是问题也随之而来,一个进程多线程的总数和大小是有要求的(这个取决于服务器的配置),不是任由我们肆意的开采的。如果订单太多,我们不控制task那是会拉仇恨的。task需要控制。
如果有对Semaphore不是很熟悉的园友可以在解开心谜。
代码正文:
//------------------------------------------------------------------------------
// <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();
The locker used to lock the semaphore and thread.
lockerObj = new object();
The semaphore limit the thread number of get latest test info
Semaphore semaphoreLimit;
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;
}
maxProcNumber = 500;
using (semaphoreLimit = new Semaphore(0, maxProcNumber))
{
// 以指定的次数退出信号量并返回前一个计数。
semaphoreLimit.Release(maxProcNumber);
var taskList = new List<Task>();
for (int i = 0; i < orderCount; i++)
{
int temp=i;
// 如果SubmitJob有IO或者其他容易因为冲突而引起异常的话,这里需要加上lock
//lock (lockerObj)
//{
semaphoreLimit.WaitOne();
taskList.Add(Task.Factory.StartNew(() =>
{
// 假设i就是job id
jobHelper.SubmitJob(temp);
// 退出信号量并返回前一个计数。
semaphoreLimit.Release();
}));
//}
}
// 等待所有task执行完毕
Task.WaitAll(taskList.ToArray());
}
// 记录处理完成的时间
DateTime completeTime = DateTime.Now.ToLocalTime();
var minutes = (completeTime - paddingTime).TotalSeconds;
Console.WriteLine(, orderCount, minutes));
}
}
}
代码效果:
多线程路还很长...