.Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法_.net framework 4 task.delay-CSDN博客
前言
在使用.net 4.0语法有点老旧,在习惯了使用Task.Run ,Task.Delay的情况下有点不适应,在网上找到一些方法后做了一些总结,主要是在Delay中增加了cancellationToken功能,当在延迟时,调用线程如果中断,则会退出Delay
public static Task Run(Action action)
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
new Thread(() =>
{
try
{
action.Invoke();
tcs.SetResult(null);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
})
{ IsBackground = true}.Start();
return tcs.Task;
}
public static Task<TReuslt> Run<TReuslt>(Func<TReuslt> function)
{
TaskCompletionSource<TReuslt> tcs = new TaskCompletionSource<TReuslt>()
new Thread(() =>
{
try
{
tcs.SetResult(function.Invoke());
}
catch (Exception ex)
{
tcs.SetException(ex);
}
})
{ IsBackground = true }.Start();
return tcs.Task;
}
/// <summary>
/// 基本延迟功能
/// </summary>
/// <param name="milliseconds"></param>
/// <returns></returns>
public static Task Delay(int milliseconds)
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
var timer = new System.Timers.Timer(milliseconds) { AutoReset = false};
timer.Elapsed += delegate {
timer.Dispose();
tcs.SetResult(null);
};
timer.Start();
return tcs.Task;
}
/// <summary>
/// 具有延迟和停止功能
/// </summary>
/// <param name="milliseconds"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public static Task Delay(int milliseconds, CancellationToken cancellationToken)
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
bool res = false;
var timer = new System.Timers.Timer(milliseconds) { AutoReset = false };
timer.Elapsed += delegate {
timer.Dispose();
res = true;
tcs.SetResult(null);
};
timer.Start();
while (!res)
{
if(cancellationToken.IsCancellationRequested)
{
timer.Stop();
tcs.SetResult(null);
break;
}
}
return tcs.Task;
}
本来想写到Task中的扩展方法
public static Task Run(this Task task,Action action)
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
new Thread(() =>
{
try
{
action.Invoke();
tcs.SetResult(null);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
})
{ IsBackground = true }.Start();
return tcs.Task;
}
但是使用时还是不方便,如果有更好的方法可以留言交流一下