C# Task管理操作帮助类

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Test
{
    public class TaskOperator
    {
        private static List<TaskOperatorModel> _taskList = new List<TaskOperatorModel>();
        private static ReaderWriterLockSlim listLock = new ReaderWriterLockSlim();

        /// <summary>
        /// 创建一个循环线程任务
        /// </summary>
        public static bool CreateTaskOne(string taskName, Action action, TaskCreationOptions taskCreationOptions = TaskCreationOptions.None, int milliseconds = 10)
        {
            if (_taskList.Exists(a => a.TaskName == taskName))
            {
                Trace.Assert(false, "Task任务中已存在该名称的任务!");
                return false;
            };

            var taskOperator = new TaskOperatorModel(taskName);
            var task = new Task(async () =>
            {
                while (true)
                {
                    if (taskOperator.Token.IsCancellationRequested)
                    {
                        listLock.EnterWriteLock();
                        _taskList.Remove(taskOperator);
                        listLock.ExitWriteLock();
                        taskOperator.Dispose();
                        taskOperator = null;
                        return;
                    }
                    taskOperator.ResetEvent.WaitOne();

                    /*
                    *
                    * 执行的任务主体
                    *
                    */
                    action();
                    await Task.Delay(milliseconds);
                }
            }, taskCreationOptions);
            task.Start();
            listLock.EnterWriteLock();
            _taskList.Add(taskOperator);
            listLock.ExitWriteLock();
            return true;
        }

        /// <summary>
        /// 暂停一个循环任务
        /// </summary>
        /// <param name="taskName"></param>
        public static void ResetTaskOne(string taskName)
        {
            listLock.EnterReadLock();
            var model = _taskList.FirstOrDefault(a => a.TaskName == taskName);

            if (model == null)
            {
                throw new Exception("Task任务中不存在该名称的任务!");
            }
            listLock.ExitReadLock();
            model.ResetEvent.Reset();
        }

        /// <summary>
        /// 继续一个循环任务
        /// </summary>
        /// <param name="taskName"></param>
        public static void SetTaskOne(string taskName)
        {
            listLock.EnterReadLock();
            var model = _taskList.FirstOrDefault(a => a.TaskName == taskName);
            if (model == null)
            {
                throw new Exception("Task任务中不存在该名称的任务!");
            }
            listLock.ExitReadLock();
            model.ResetEvent.Set();
        }

        /// <summary>
        /// 关闭一个循环线程任务
        /// </summary>
        public static void CloseTaskOne(string taskName, int milliseconds = 10)
        {
            Task.Factory.StartNew(() =>
            {
                Task.Delay(milliseconds);
                listLock.EnterReadLock();
                var model = _taskList.FirstOrDefault(a => a.TaskName == taskName);
                if (model == null)
                {
                    return;
                }
                listLock.ExitReadLock();
                model.TokenSource.Cancel();
            });
        }

        private class TaskOperatorModel : IDisposable
        {
            public TaskOperatorModel(string taskName)
            {
                TaskName = taskName;
                Token = TokenSource.Token;
            }

            /// <summary>
            /// 任务名称
            /// </summary>
            public string TaskName { get; set; }

            public CancellationTokenSource TokenSource { get; set; } = new CancellationTokenSource();

            public CancellationToken Token { get; set; }
            public ManualResetEvent ResetEvent { get; set; } = new ManualResetEvent(true);

            #region IDisposable Support
            private bool disposedValue = false; // 要检测冗余调用

            protected virtual void Dispose(bool disposing)
            {
                if (!disposedValue)
                {
                    if (disposing)
                    {
                        // TODO: 释放托管状态(托管对象)。
                    }

                    // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                    // TODO: 将大型字段设置为 null。
                    TokenSource.Dispose();
                    ResetEvent.Close();
                    ResetEvent.Dispose();
                    TokenSource = null;
                    ResetEvent = null;

                    disposedValue = true;
                }
            }

            // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
            // ~TaskOperatorModel() {
            //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            //   Dispose(false);
            // }

            // 添加此代码以正确实现可处置模式。
            public void Dispose()
            {
                // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
                Dispose(true);
                // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
                // GC.SuppressFinalize(this);
            }
            #endregion

        }
    }


}

 

上一篇:[吴恩达团队自然语言处理第二课_2]自动补全与语言模型


下一篇:C语言如何获取文件大小?fseek() + ftell()