C# Task ContinueWith的实现

本文深入探讨了C#中Task的ContinueWith方法,详细解释了其内部工作原理,包括如何包装Action或Func,调用ContinueWithCore方法,以及StandardTaskContinuation的执行流程。在Task完成后,FinishContinuations方法会触发后续任务的执行。
摘要由CSDN通过智能技术生成

看了上一篇C# Task 是什么?返回值如何实现? Wait如何实现 我们提到FinishContinuations方法中会调用TaskContinuation实例,那么我们的ContinueWith就应该非常简单,只需要把TASK放到TaskContinuation结合中就可以了,ContinueWith可以是 Action<Task<TResult>>也可以是 Func<Task<TResult>,TNewResult> ,其中Task<TResult>的实现如下:


 public class Task<TResult> : Task{
    //Creates a continuation that executes when the target Task{TResult}" completes
    public Task ContinueWith(Action<Task<TResult>> continuationAction)
    {
        StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
        return ContinueWith(continuationAction, TaskScheduler.Current, default(CancellationToken), TaskContinuationOptions.None, ref stackMark);
    }
    internal Task ContinueWith(Action<Task<TResult>> continuationAction, TaskScheduler scheduler, CancellationToken cancellationToken,TaskContinuationOptions continuationOptions, ref StackCrawlMark stackMark)
    {
        if (continuationAction == null)
        {
            throw new ArgumentNullException("continuationAction");
        }
        if (scheduler == null)
        {
            throw new ArgumentNullException("scheduler");
        }
        TaskCreationOptions creationOptions;
        InternalTaskOptions internalOptions;
        CreationOptionsFromContinuationOptions(continuationOptions,out creationOptions,out internalOptions);
        
        Task continuationTask = new ContinuationTaskFromResultTask<TResult>(this, continuationAction, null,    creationOptions, internalOptions,ref stackMark);
        ContinueWithCore(continuationTask, scheduler, cancellationToken, continuationOptions);
        return continuationTask;
    }
    
    public Task<TNewResult> ContinueWith<TNewResult>(Func<Task<TResult>, Object, TNewResult> continuationFunction, Object state)
    {
        StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
        return ContinueWith<TNewResult>(continuationFunction, state, TaskScheduler.Current, default(CancellationToken), TaskContinuationOptions.None, ref stackMark);
    }

    // Same as the above overload, just with a stack mark.
    internal Task<TNewResult> ContinueWith<TNewResult>(Func<Task<TResult>, Object, TNewResult> continuationFunction, Object state,TaskScheduler scheduler, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, ref StackCrawlMark stackMark)
    {
        if (continuationFunction == null)
        {
            throw new ArgumentNullException("continuationFunction");
        }
        if (scheduler == null)
        {
            throw new ArgumentNullException("scheduler");
        }

        TaskCreationOptions creationOptions;
        InternalTaskOptions internalOptions;
        CreationOptionsFromContinuationOptions(continuationOptions,out creationOptions,out internalOptions);

        Task<TNewResult> continuationFuture = new ContinuationResultTaskFromResultTask<TResult,TNewResult>(this, continuationFunction, state,creationOptions, internalOptions,ref stackMark);
        ContinueWithCore(continuationFuture, scheduler, cancellationToken, continuationOptions);
        return continuationFuture;
    }
 }

ContinueWith的核心是调用Task的ContinueWithCore方法,这里把我们的Action或Fun包装成子的Task,比如这里的ContinuationResultTaskFromResultTask实现【很是标准】如下:

 internal sealed class ContinuationResultTaskFromResultTask<TAntecedentResult, TResult> : Task<TResult>
    {
        private Task<TAntecedentResult> m_antecedent;
        public ContinuationResultTaskFromResultTask(
            Task<TAntecedentResult> antecedent, Delegate function, object state, TaskCreationOptions creationOptions, InternalTaskOptions internalOptions, ref StackCrawlMark stackMark) :
            base(function, state, Task.InternalCurrentIfAttached(creationOptions), default(CancellationToken), creationOptions, internalOptions, null)
        {
            Contract.Requires(function is Func<Task<TAntecedentResult>, TResult> || function is Func<Task<TAntecedentResult>, object, TResult>, "Invalid delegate type in ContinuationResultTaskFromResultTask
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值