目录多线程
好比有100个任务,多线程异步执行,统计执行完全部任务所耗费的时间。如,开始线程是线程A,最后的线程是B,记录B的DataTime.Now-A的DataTime.Now.异步
由于这里涉及到多线程,异步,因此须要在最后一个任务线程判断是否执行完。跟任务开始的线程确定不属于同一个线程。至关于要在不一样线程里记录传递变量。async
须要有个全局的单例来记录A开始的DateTime.Now。而后在B中取当前时间减去A的开始时间,即为面向内存级别的任务队列的执行时间。测试
由于开始时间是DataTime类型,并且考虑到之后单例会用到各类类型,因此这里用泛型去实现。spa
namespace Singleton { /**//// <summary> /// 泛型实现单例模式 /// </summary> /// <typeparam name="T">须要实现单例的类</typeparam> public class Singleton<T> where T : new() { /**//// <summary> /// 返回类的实例 /// </summary> public static T Instance { get { return SingletonCreator.instance; } } class SingletonCreator { internal static readonly T instance = new T(); } } }
startTime.cs线程
public class StartTime { private DateTime _time; public StartTime() { _time = DateTime.Now; } public string Time { get { return _time.ToString(); } } }
在主线程中,调用6W个任务以前实例化单例。code
var _startTime = Singleton<StartTime>.Instance.Time; Console.WriteLine("开始时间 " + _startTime ); for (int i=0;i<=60000;i++){ int Wait=rnd.Next(1,10) * 1000; var parm=new MyParameters{delayTime= 2000, JobNo=i}; obj.Queue(futureTask: async ()=>{await RunMyJob(parm); }); }
最后一个任务结束时,获取当前时间,再减去单例的任务开始时间便可。队列
if (_processingQueue.IsEmpty && _runningTasks.IsEmpty) { // Interlocked.Exchange might not be necessary var _oldQueue = Interlocked.Exchange( ref _tscQueue, new TaskCompletionSource<bool>()); _oldQueue.TrySetResult(true); _isQueueRunning = false; var TaskTime = DateTime.Now - Convert.ToDateTime(Singleton<StartTime>.Instance.Time); Console.WriteLine("任务所用时间 " + TaskTime); }