有没有办法使用任务并行库来安排任务在未来执行?
我意识到我可以使用诸如 System.Threading.Timer 之类的 pre-.NET4 方法来做到这一点……但是,如果有 TPL 方法可以做到这一点,我宁愿留在框架的设计中。但是我找不到。
谢谢你。
有没有办法使用任务并行库来安排任务在未来执行?
我意识到我可以使用诸如 System.Threading.Timer 之类的 pre-.NET4 方法来做到这一点……但是,如果有 TPL 方法可以做到这一点,我宁愿留在框架的设计中。但是我找不到。
谢谢你。
此功能是在Async CTP中引入的,现在已被整合到 .NET 4.5 中。如下执行不会阻塞线程,而是返回一个将在未来执行的任务。
Task<MyType> new_task = Task.Delay(TimeSpan.FromMinutes(5))
.ContinueWith<MyType>( /*...*/ );
(如果使用旧的 Async 版本,请使用静态类TaskEx
而不是Task
)
您可以编写自己的 RunDelayed 函数。这需要延迟和延迟完成后运行的函数。
public static Task<T> RunDelayed<T>(int millisecondsDelay, Func<T> func)
{
if(func == null)
{
throw new ArgumentNullException("func");
}
if (millisecondsDelay < 0)
{
throw new ArgumentOutOfRangeException("millisecondsDelay");
}
var taskCompletionSource = new TaskCompletionSource<T>();
var timer = new Timer(self =>
{
((Timer) self).Dispose();
try
{
var result = func();
taskCompletionSource.SetResult(result);
}
catch (Exception exception)
{
taskCompletionSource.SetException(exception);
}
});
timer.Change(millisecondsDelay, millisecondsDelay);
return taskCompletionSource.Task;
}
像这样使用它:
public void UseRunDelayed()
{
var task = RunDelayed(500, () => "Hello");
task.ContinueWith(t => Console.WriteLine(t.Result));
}
设置一个一次性计时器,在触发时启动任务。例如,下面的代码将在开始任务前等待五分钟。
TimeSpan TimeToWait = TimeSpan.FromMinutes(5);
Timer t = new Timer((s) =>
{
// start the task here
}, null, TimeToWait, TimeSpan.FromMilliseconds(-1));
这TimeSpan.FromMilliseconds(-1)
使计时器成为一次性计时器,而不是周期性计时器。