C# Task管理操作帮助类
2022/2/21 17:28:56
本文主要是介绍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 } } }
这篇关于C# Task管理操作帮助类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#