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
}
}
}