当前位置: 首页 > 编程语言 > C#

与等待继续的ContinueWith(delegate,CancellationToken)的等效分享

时间:2023-04-11 11:09:06 C#

C#学习教程:分享等同于ContinueWith(delegate,CancellationToken)WaitingtoContinue}特别是,我在这里感兴趣的行为在MSDN页面上的ContinuationTasks中有详细说明:在这些情况下,延续进入“已取消”状态:上面的代码有效。但是,我将尽可能多的延续转换为使用await关键字。是否有等效的使用await允许在等待任务完成之前取消继续?下面应该这样做,虽然它看起来有点尴尬:privateTaskLongRunningTask=/*Something*/;privatevoidDoSomethingMore(){}publicasyncTaskIndependentlyCancelableSuccessorTask(CancellationTokencancellationToken){cancellationToken.ThrowIfCancellationRequested();;使用(cancellationToken.Register(()=>tcs.TrySetCanceled()))awaitTask.WhenAny(LongRunningTask,tcs.Task);cancellationToken.ThrowIfCancellationRequested();多做点事();}[更新]正如svick所建议的,在这里它被建模为一个助手,基于StephenToub对then的实现和await模式:publicstaticclassTaskExt{//////使用:awaitLongRunningTask.Then(DoSomethingMore,cancellationToken)///publicstaticasyncTaskThen(thisTaskantecedent,Actioncontinuation,CancellationTokentoken){awaitantecedent.When(token);}继续();}//////使用:awaitLongRunningTask.When(cancellationToken)///publicstaticasyncTaskWhen(thisTaskantecedent,CancellationTokentoken){token.ThrowIfCancellationRequested();vartcs=newTaskCompletionSource();使用(token.Register(()=>tcs.TrySetCanceled()))awaitTask.WhenAny(antecedent,tcs.Task);token.ThrowIfCancellationRequested();}结构空{};也许,第一个ThrowIfCancellationRequested()是多余的,但我没有彻底考虑所有边缘情况虽然这个答案在概念上与Noseratio相同,但我对实现的一些细节不满意,所以我发布了我的建议助手实现,以便其他人可以就此问题发表评论。publicstaticasyncTaskWhenNotCanceled(thisTaskmainTask,CancellationTokencancellationToken){if(!cancellationToken.CanBeCanceled){returnawaitmainTask.ConfigureAwait(false);cancellationToken.ThrowIfCancellationRequested();任务完成任务;varcancellationTaskSource=newTaskCompletionSource();使用(cancellationToken.Register(()=>cancellationTaskSource.TrySetCanceled(),useSynchronizationContext:false)completedTask=awaitTask.WhenAny(mainTask,cancellationTaskSource.Task).ConfigureAwait(false);cancellationToken.ThrowIfCancellationRequested();returnawaitcompletedTask.ConfigureAwait(false);}publicstaticasyncTaskWhenNotCanceled(thisTaskmainTask,CancellationTokencancellationToken){if(!cancellationToken.CanBeCanceled){awaitmainTask.ConfigureAwait(false);返回;}cancellationToken.ThrowIfCancellationRequested();TaskcompletedTask;varcancellationTaskSource=新的TaskCompletionSource();使用(取消motionToken.Register(()=>cancellationTaskSource.TrySetCanceled(),useSynchronizationContext:false)completedTask=awaitTask.WhenAny(mainTask,cancellationTaskSource.Task).ConfigureAwait(false);cancellationToken.ThrowIfCancellationRequested();等待;}没有取消消去的异常模式:publicasyncTaskIndependentlyCancelableSuccessorTask(){awaitLongRunningTask;多做点事();}取消和WhenNotCanceled异常步骤:publicasyncTaskIndependentlyCancelableSuccessorTask(CancellationTokencancellationToken){多做点事();我的回答与@JeanHominal的略有不同,也采用了@Noseratio的方法:返回OrWhenCancelled_(mainTask,cancellationToken);}privatestaticasyncTaskOrWhenCancelled_(thisTaskmainTask,CancellationTokencancellationToken){TaskcancellationTask=Task.Delay(Timeout.Infinite,cancellationToken);awaitTask.WhenAny(mainTask,cancellationTask).ConfigureAwait(false);cancellationToken.ThrowIfCancellationRequested();(此任务mainTask,CancellationTokencancellationToken){if(!cancellationToken.CanBeCanceled)returnmainTask;返回OrWhenCancelled_(mainTask,cancellationToken);}privatestaticasyncTaskOrWhenCancelled_(thisTaskmainTask,CancellationTokencancellationToken){TaskcancellationTask=Task.Delay(Timeout.Infinite,cancellationToken);awaitTask.WhenAny(mainTask,cancellationTask).ConfigureAwait(false);cancellationToken.ThrowIfCancellationRequested();等待主任务;是C#学习教程:等同于ContinueWith(delegate,CancellationToken)等待继续共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicstaticTaskWithCancellation(thisTasktask,CancellationTokentoken){returntask.ContinueWith(t=>t.GetAwaiter().GetResult(),token,TaskContinuationOptions.ExecuteSynchronously,TaskScheduler.Default);}publicstaticTaskWithCancellation(thisTasktasken,CancellationToktoken){returntask.ContinueWith(t=>t.GetAwaiter().GetResult(),token,TaskContinuationOptions.ExecuteSynchronously,TaskScheduler.Default);}本文收集自网络,不代表立场。如涉及侵权请点击维权联系管理会员删除如需转载请注明出处:

最新推荐
猜你喜欢