を使用して、タスクパイプライン/順序付きスケジューラを作成しようとしていますTaskFactory.FromAsync
。
(I / O完了ポートを使用して)Webサービス要求を実行できるようにしたいのですがFromAsync
、それらの順序を維持し、一度に1つの要求のみを実行します。
現時点では使用していないFromAsync
ので、1つのリクエストのみが未処理であることを確認するために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
)
しかし、ドキュメントは言う:
endメソッドを実行するタスクをスケジュールするために使用されるTaskScheduler。
そしてあなたが見ることができるように、それはすでに構築されたものを取ります、ではありIAsyncResult
ませんFunc<IAsyncResult>
。
これはカスタムFromAsync
メソッドを必要としますか、それとも何かが足りませんか?誰かがこの実装をどこから始めるべきか提案できますか?
乾杯、
編集:
この動作を呼び出し元から抽象化したいので、TaskFactory
(特殊なTaskScheduler
)の動作に従って、タスクをすぐに返す必要があります-このタスクは、FromAsync
タスクをカプセル化するだけでなく、待機中にそのタスクのキューイングも行います実行する順番です。
考えられる解決策の1つ:
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
呼び出しが発生している間、スレッドを利用します。理想的には、そうする必要はありません。