2

私はWCFサービスを構築しようとしています -

  1. 単一インスタンス
  2. クライアントが関数に対して複数のリクエストを行うことを許可します (例: StartJob)
  3. StarJob(request) は、並行タスク スケジュールで実行されている TaskFactory (1 つのインスタンス) への要求を「キューに入れます」(例に従って実装)

  4. タスク ファクトリのタスクが完了すると、応答が返されます。

  5. タスクの実行中にさらにリクエストが来ると、それらはキューに入れられます (最大同時実行数に達した場合)

目的は、クライアントからの要求を受け取り、処理のためにキューに入れるシステムを構築することです。

現在、私のコード (以下に示す) は、タスク スケジューラの最大同時実行数を考慮せずに、すべての要求を同時に実行します。

質問

  1. 私は何を見逃していますか?
  2. 私が見ることができる良い例/参考文献はありますか? (これは珍しい使用例ではないと確信しています)

コード

Iサービス

[ServiceContract]
public interface ISupportService
{
    [OperationContract]
    Task<TaskResponse> StartTask(TaskRequest taskRequest);
}

サービス

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class SupportService : ISupportService
{
    private static TaskRequestHandler taskRequestHandler;

    public SupportService()
    {        
        taskRequestHandler = TaskRequestHandler.GetInstance();         
    }

    public Task<TaskResponse> StartTask(TaskRequest taskRequest)
    {
        var tcs = new TaskCompletionSource<TaskResponse>();

        if (!IsTaskRequestValid(taskRequest))
            tcs.SetResult(new TaskResponse()});

        taskRequestHandler.StartTaskAsync(taskRequest, lockHandler).ContinueWith(task => { tcs.SetResult(task.Result); });

        return tcs.Task;
    }    
}

TaskRequestHandler

public class TaskRequestHandler
{
    private ConcurrentTaskScheduler taskScheduler;
    private TaskFactory taskFactory;

    private TaskRequestHandler()
    {
        taskScheduler = new ConcurrentTaskScheduler(2);
        taskFactory = new TaskFactory(taskScheduler);
    }

    private Task<TaskResponse> StartTaskAsync (TaskRequest request, LockHandler lockHandler)
    {
        var tcs = new TaskCompletionSource<TaskResponse>();
        taskFactory.StartNew(() =>
        {
            //Some task with tcs.SetResults()
        });

        return tcs.Task;
    }
}
4

1 に答える 1