如何创建通用 Task.ContinueWith 扩展方法
How to create a generic Task.ContinueWith extension method
所以目前我有一个 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);
}
但这不会编译,因为
The type or namespace name T could not be found
如何创建通用 Task.ContinueWith
扩展方法?
您在方法名称中缺少 T
声明。另外你的 Action<T>
需要变成 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
扩展方法,如下所示:
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);
}
但这不会编译,因为
The type or namespace name T could not be found
如何创建通用 Task.ContinueWith
扩展方法?
您在方法名称中缺少 T
声明。另外你的 Action<T>
需要变成 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);
}