How to create a generic Task.ContinueWith extension method

泪湿孤枕 提交于 2019-12-24 02:54:05

问题


So currently I have a Task.ContinueWith extensions method like so:

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);
}

and this works fine but it doesn't give me access to the result of the Task so I would like to create a generic extension method.

I have tried:

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);
}

But this won't compile because

The type or namespace name T could not be found

How do I create a generic Task.ContinueWith extension method?


回答1:


You're missing the T declaration in the method name. Also you Action<T> needs to become a Func<Task<T>, T>:

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);
}


来源:https://stackoverflow.com/questions/30391498/how-to-create-a-generic-task-continuewith-extension-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!