using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace XFEExtension.TaskExtension { /// /// 任务的拓展 /// public static class TaskExtension { private static long CTimeCounter = 0; #region 新建任务并开始 /// /// 新建一个任务并开始 /// /// /// 运行的任务 public static Task StartNewTask(this Action action) { return Task.Run(action); } /// /// 新建一个任务并开始 /// /// /// /// 对象 /// public static Task StartNewTask(this Action action, T t) { return Task.Run(() => action(t)); } /// /// 新建一个任务并开始 /// /// /// /// public static async Task StartNewTask(this Func func) { return await Task.Run(func); } #endregion /// /// 等待任务完成 /// /// /// /// public static T WaitAndGetResult(this Task task) { task.Wait(); return task.Result; } /// /// 计算一段代码执行所需时间 /// /// /// 自动输出 /// 该次计时标识名 /// public static TimeSpan CTime(this Action action, bool autoOutPut = true, string timerName = "无标识名计时器") { var timeCounter = new Stopwatch(); timeCounter.Start(); action?.Invoke(); timeCounter.Stop(); CTimeCounter++; var elapsedTime = timeCounter.Elapsed; if (autoOutPut) if (elapsedTime.TotalHours >= 1) Console.WriteLine($"标识名:{timerName}\t执行批次:{CTimeCounter}\t执行时间:{elapsedTime}"); else if (elapsedTime.TotalMinutes >= 1) Console.WriteLine($"标识名:{timerName}\t执行批次:{CTimeCounter}\t执行时间: {Math.Floor(elapsedTime.TotalMinutes)} 分 {elapsedTime.Seconds} 秒"); else if (elapsedTime.TotalSeconds >= 1) Console.WriteLine($"标识名:{timerName}\t执行批次:{CTimeCounter}\t执行时间: {elapsedTime.TotalSeconds:F3} 秒"); else if (elapsedTime.TotalMilliseconds >= 1) Console.WriteLine($"标识名:{timerName}\t执行批次:{CTimeCounter}\t执行时间: {elapsedTime.TotalMilliseconds:F3} 毫秒"); else Console.WriteLine($"标识名:{timerName}\t执行批次:{CTimeCounter}\t执行时间: {elapsedTime.TotalMilliseconds * 1000:F3} 纳秒"); return elapsedTime; } } /// /// 传入值并终止等待器 /// /// 泛型 /// 任务ID /// 目标等待器返回值 public delegate void EndTaskTrigger(T result, string taskId = "DEFAULTTASKID"); /// /// XFE等待器 /// /// 泛型 public class XFEWaitTask { private TaskCompletionSource WaitTaskSource { get; set; } = new TaskCompletionSource(); /// /// 任务ID /// public string TaskId { get; set; } /// /// 结束任务并返回 /// /// 返回结果 /// 任务ID public void EndTask(T result, string taskId) { if (taskId == TaskId) WaitTaskSource.SetResult(result); } /// /// 获取等待器 /// /// public TaskAwaiter GetAwaiter() { return WaitTaskSource.Task.GetAwaiter(); } /// /// XFE等待器 /// /// 触发任务结束事件 /// 任务ID public XFEWaitTask(ref EndTaskTrigger endTaskAndReturn, string taskId = "DEFAULTTASKID") { endTaskAndReturn += EndTask; TaskId = taskId; } } /// /// 任务同步器 /// public class TaskSynchronizer { /// /// 当前任务 /// public Task CurrentTask { get; set; } /// /// 返回当前任务的等待器 /// /// public TaskAwaiter GetAwaiter() { if (CurrentTask != null) return CurrentTask.GetAwaiter(); else return Task.CompletedTask.GetAwaiter(); } /// /// 添加任务 /// /// 待执行任务 public void AddTask(Task task) { CurrentTask = task; } /// /// 任务同步器 /// public TaskSynchronizer() { } /// /// 任务同步器 /// /// 第一个待执行任务 public TaskSynchronizer(Task task) { CurrentTask = task; } } }