我目前正试图在一个必须针对.Net 4.0的程序中实现替代.Net 4.5的Task.Delay()
方法。我在这个博客上找到了以下代码。
/* You can write Task-based asynchronous methods by utilizing a TaskCompletionSource.
A TaskCompletionSource gives you a 'slave' Task that you can manually signal.
Calling SetResult() signals the task as complete, and any continuations kick off. */
void Main()
{
for (int i = 0; i < 10000; i++)
{
Task task = Delay (2000);
task.ContinueWith (_ => "Done".Dump());
}
}
Task Delay (int milliseconds) // Asynchronous NON-BLOCKING method
{
var tcs = new TaskCompletionSource<object>();
new Timer (_ => tcs.SetResult (null)).Change (milliseconds, -1);
return tcs.Task;
}
任务
对我来说还比较新。 System.Threading.Timer
和 TaskCompletionSource
对我来说是全新的(截至今天),我对它们有些困惑。 除此之外,我想知道如何将CancellationToken
功能添加到这段代码中。 我假设可以像这样向Delay()
方法添加一个参数:
Task Delay (int milliseconds, CancellationToken token) // Asynchronous NON-BLOCKING method
{
var tcs = new TaskCompletionSource<object>();
new Timer (_ => tcs.SetResult (null)).Change (milliseconds, -1);
return tcs.Task;
}
...但是,我应该在哪里放置检查令牌并退出方法的逻辑呢?是在回调函数中吗?这是否可能?
TaskEx.Delay()
来使用延迟功能。 - Scott Chamberlain