.NET 4.5 中有一种新ConcurrentExclusiveSchedulerPair
类型(我不记得它是否包含在 Async CTP 中),您可以使用它ExclusiveScheduler
来限制一次执行一个Task
。
考虑将您的问题构建为Dataflow。很容易将 a 传递给TaskScheduler
您想要限制的数据流部分的块选项。
如果您不想(或不能)使用 Dataflow,您可以自己做类似的事情。请记住,在 TAP 中,您总是返回已启动的任务,因此您不会像在 TPL 中那样将“创建”与“调度”分开。
您可以像这样ConcurrentExclusiveSchedulerPair
安排Action
s(或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)
(在这种情况下,它直接在线程池上继续)。