.NET 4.5 中有一种新ConcurrentExclusiveSchedulerPair类型(我不记得它是否包含在 Async CTP 中),您可以使用它ExclusiveScheduler来限制一次执行一个Task。
考虑将您的问题构建为Dataflow。很容易将 a 传递给TaskScheduler您想要限制的数据流部分的块选项。
如果您不想(或不能)使用 Dataflow,您可以自己做类似的事情。请记住,在 TAP 中,您总是返回已启动的任务,因此您不会像在 TPL 中那样将“创建”与“调度”分开。
您可以像这样ConcurrentExclusiveSchedulerPair安排Actions(或async没有返回值的 lambda):
public static ConcurrentExclusiveSchedulerPair schedulerPair =
new ConcurrentExclusiveSchedulerPair();
public static TaskFactory exclusiveTaskFactory =
new TaskFactory(schedulerPair.ExclusiveScheduler);
...
public static Task RunExclusively(Action action)
{
return exclusiveTaskFactory.StartNew(action);
}
public static Task RunExclusively(Func<Task> action)
{
return exclusiveTaskFactory.StartNew(action).Unwrap();
}
对此有几点需要注意:
ConcurrentExclusiveSchedulerPair只有坐标s的单个实例Task排队到其调度程序。第二个实例ConcurrentExclusiveSchedulerPair将独立于第一个实例,因此您必须确保在要协调的系统的所有部分中使用相同的实例。
- 一个
async方法将 - 默认情况下 - 在TaskScheduler启动它的相同处恢复。所以这意味着如果一个async方法调用另一个async方法,“子”方法将“继承”父方法的TaskScheduler. 任何async方法都可以选择不继续TaskScheduler使用ConfigureAwait(false)(在这种情况下,它直接在线程池上继续)。