我正在尝试创建一个任务管道/有序调度器,同时使用
目前我没有使用
我认为当使用
所有这些
但是文档中提到:
任务计划程序用于安排执行结束方法的任务。
并且,您可以看到它使用已经构造好的 IAsyncResult,而不是 Func。这是否需要一个自定义的FromAsync方法或者我漏掉了什么?有人能建议在哪里开始进行此实现吗?谢谢,
编辑:
我希望将这种行为从调用方中抽象出来,因此,根据 TaskFactory 的行为(具有专门的 TaskScheduler),需要立即返回Task——此Task不仅封装了 FromAsync 任务,而且还封装了等待轮到它执行时的任务队列。其中一种可能的解决方案:
TaskFactory.FromAsync
。 我想能够触发 Web 服务请求(使用FromAsync
使用 I/O 完成端口),但保持其顺序,并且任何时候只有一个正在执行。目前我没有使用
FromAsync
,所以可以执行TaskFactory.StartNew(()=>api.DoSyncWebServiceCall())
并依赖于OrderedTaskScheduler
,由TaskFactory
使用来确保只有一个请求是未完成状态。我认为当使用
FromAsync
方法时,这种行为将保持不变,但事实并非如此:TaskFactory<Stuff> taskFactory = new TaskFactory<Stuff>(new OrderedTaskScheduler());
var t1 = taskFactory.FromAsync((a, s) => api.beginGetStuff(a, s), a => api.endGetStuff(a));
var t2 = taskFactory.FromAsync((a, s) => api.beginGetStuff(a, s), a => api.endGetStuff(a));
var t3 = taskFactory.FromAsync((a, s) => api.beginGetStuff(a, s), a => api.endGetStuff(a));
所有这些
beginGetStuff
方法都在FromAsync
调用中被调用(虽然它们按顺序分派,但同时发生了n
个API调用)。
FromAsync
有一个重载,需要传入一个TaskScheduler:public Task FromAsync(
IAsyncResult asyncResult,
Action<IAsyncResult> endMethod,
TaskCreationOptions creationOptions,
TaskScheduler scheduler
)
但是文档中提到:
任务计划程序用于安排执行结束方法的任务。
并且,您可以看到它使用已经构造好的 IAsyncResult,而不是 Func。这是否需要一个自定义的FromAsync方法或者我漏掉了什么?有人能建议在哪里开始进行此实现吗?谢谢,
编辑:
我希望将这种行为从调用方中抽象出来,因此,根据 TaskFactory 的行为(具有专门的 TaskScheduler),需要立即返回Task——此Task不仅封装了 FromAsync 任务,而且还封装了等待轮到它执行时的任务队列。其中一种可能的解决方案:
class TaskExecutionQueue
{
private readonly OrderedTaskScheduler _orderedTaskScheduler;
private readonly TaskFactory _taskFactory;
public TaskExecutionQueue(OrderedTaskScheduler orderedTaskScheduler)
{
_orderedTaskScheduler = orderedTaskScheduler;
_taskFactory = new TaskFactory(orderedTaskScheduler);
}
public Task<TResult> QueueTask<TResult>(Func<Task<TResult>> taskGenerator)
{
return _taskFactory.StartNew(taskGenerator).Unwrap();
}
}
然而,这会在 FromAsync
调用时使用一个线程。理想情况下,我不希望这样做。