- 这是参考大佬分享的代码写的有问题请提出指正,谢谢。
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace TaskManager
{class TaskFactoryMananger{public static void Run(){try{while (true){LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(10);TaskFactory factory = new TaskFactory(lcts);Task[] spiderTask = new Task[] {factory.StartNew(() =>{Log.Logger.Information("{0} Start on thread {1}", "111", Thread.CurrentThread.ManagedThreadId); Log.Logger.Information("{0} Finish on thread {1}", "111", Thread.CurrentThread.ManagedThreadId);}),factory.StartNew(() =>{Thread.Sleep(TimeSpan.FromSeconds(3));Log.Logger.Information("{0} Start on thread {1}", "222", Thread.CurrentThread.ManagedThreadId);Log.Logger.Information("{0} Finish on thread {1}", "222", Thread.CurrentThread.ManagedThreadId);}),factory.StartNew(() =>{Thread.Sleep(TimeSpan.FromSeconds(5));Log.Logger.Information("{0} Start on thread {1}", "333", Thread.CurrentThread.ManagedThreadId);Log.Logger.Information("{0} Finish on thread {1}", "333", Thread.CurrentThread.ManagedThreadId);})};Task.WaitAll(spiderTask);Thread.Sleep(TimeSpan.FromMinutes(1));}}catch (AggregateException ex){foreach (Exception inner in ex.InnerExceptions){Log.Logger.Error(inner.Message);}}}public class LimitedConcurrencyLevelTaskScheduler : TaskScheduler{[ThreadStatic]private static bool _currentThreadIsProcessingItems;private readonly LinkedList<Task> _tasks = new LinkedList<Task>(); private readonly int _maxDegreeOfParallelism;private int _delegatesQueuedOrRunning = 0; public LimitedConcurrencyLevelTaskScheduler(int maxDegreeOfParallelism){if (maxDegreeOfParallelism < 1) throw new ArgumentOutOfRangeException("maxDegreeOfParallelism");_maxDegreeOfParallelism = maxDegreeOfParallelism;}protected sealed override void QueueTask(Task task){lock (_tasks){_tasks.AddLast(task);if (_delegatesQueuedOrRunning < _maxDegreeOfParallelism){++_delegatesQueuedOrRunning;NotifyThreadPoolOfPendingWork();}}}private void NotifyThreadPoolOfPendingWork(){ThreadPool.UnsafeQueueUserWorkItem(_ =>{_currentThreadIsProcessingItems = true;try{while (true){Task item;lock (_tasks){if (_tasks.Count == 0){--_delegatesQueuedOrRunning;break;}item = _tasks.First.Value;_tasks.RemoveFirst();}base.TryExecuteTask(item);}}finally { _currentThreadIsProcessingItems = false; }}, null);}protected sealed override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued){if (!_currentThreadIsProcessingItems) return false;if (taskWasPreviouslyQueued) TryDequeue(task);return base.TryExecuteTask(task);}protected sealed override bool TryDequeue(Task task){lock (_tasks) return _tasks.Remove(task);}public sealed override int MaximumConcurrencyLevel { get { return _maxDegreeOfParallelism; } }protected sealed override IEnumerable<Task> GetScheduledTasks(){bool lockTaken = false;try{Monitor.TryEnter(_tasks, ref lockTaken);if (lockTaken) return _tasks.ToArray();else throw new NotSupportedException();}finally{if (lockTaken) Monitor.Exit(_tasks);}}}}
}