如何创建一个通用的Task.ContinueWith扩展方法 [英] How to create a generic Task.ContinueWith extension method

查看:166
本文介绍了如何创建一个通用的Task.ContinueWith扩展方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

这个工作正常,但它不能让我访问结果 Task 所以我想创建一个通用的扩展方法。

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.

我试过了:

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

如何创建一个普通的 Task.ContinueWith 扩展方法?

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

推荐答案

方法名称中的 T 声明。您还需要 Action< $> 成为 Func< Task< T> ;, T>

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

这篇关于如何创建一个通用的Task.ContinueWith扩展方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆