如何创建通用Task.ContinueWith扩展方法

问题描述 投票:2回答:1

所以目前我有一个Task.ContinueWith扩展方法,如下所示:

public static Task ContinueWith_UsingSyncContextWorkaround(this Task task, Action<Task> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler, SynchronizationContext sc)
{
    Action<Task> actionWithWorkaround = t =>
    {
        SynchronizationContext.SetSynchronizationContext(sc);
        continuationAction(t);
    };

    return task.ContinueWith(actionWithWorkaround, cancellationToken, continuationOptions, scheduler);
}

并且此方法工作正常,但它无法让我访问Task的结果,因此我想创建一个通用扩展方法。

我尝试过:

public static Task<T> ContinueWith_UsingSyncContextWorkaround(this Task<T> task, Action<Task<T>> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler, SynchronizationContext sc)
{
    Action<Task<T>> actionWithWorkaround = t =>
    {
        SynchronizationContext.SetSynchronizationContext(sc);
        continuationAction(t);
    };

    return task.ContinueWith(actionWithWorkaround, cancellationToken, continuationOptions, scheduler);
}

但是这不会编译,因为

找不到类型或名称空间名称T

如何创建通用的Task.ContinueWith扩展方法?

c# generics task-parallel-library
1个回答
5
投票
public static Task<T> ContinueWithUsingSyncContextWorkaround<T>(this Task<T> task, Func<Task<T>, T> continuationFunc, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler, SynchronizationContext sc) { Func<Task<T>, T> funcWithWorkaround = t => { SynchronizationContext.SetSynchronizationContext(sc); return continuationFunc(t); }; return task.ContinueWith<T>(funcWithWorkaround, cancellationToken, continuationOptions, scheduler); }
© www.soinside.com 2019 - 2024. All rights reserved.