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