
/* 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;} …但是,我在哪里放置检查令牌和退出方法的逻辑?在回调的某个地方?这甚至可能吗?
解决方法 我试图尽可能少地更改你的代码,但这是一个工作示例,其行为与Task.Delay相同.重要的是要注意我使用TrySetCanceled和TrySetResult,因为Timer可以在任务取消后完成.理想情况下,您想要停止计时器.
另请注意,取消的任务将抛出TaskCanceledException
static voID Main(string[] args){ // A cancellation source that will cancel itself after 1 second var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(1)); try { // This will only wait 1 second because as it will be cancelled. Task t = Delay(5000,cancellationTokenSource.Token); t.Wait(); Console.Writeline("The task completed"); } catch (AggregateException exception) { // Expecting a TaskCanceledException foreach (Exception ex in exception.InnerExceptions) Console.Writeline("Exception: {0}",ex.Message); } Console.Writeline("Done"); Console.Readline();}private static Task Delay(int milliseconds,CancellationToken token){ var tcs = new taskcompletionsource<object>(); token.Register(() => tcs.TrySetCanceled()); Timer timer = new Timer(_ => tcs.TrySetResult(null)); timer.Change(milliseconds,-1); return tcs.Task;} 再读一下你的问题.如果您需要Task.Delay并且您的目标是.NET 4.0,那么您应该使用http://www.nuget.org/packages/Microsoft.Bcl.Async/中的Microsoft Async nuget包它包含方法TaskEx.Delay
总结以上是内存溢出为你收集整理的c# – 取消.Net 4.0中的任务延迟全部内容,希望文章能够帮你解决c# – 取消.Net 4.0中的任务延迟所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)