0

TaskFactory クラスを使用して、最大 5 スレッドまで、処理中の保留中の transactionId ごとに 1 つずつ、複数のタスクを並行して作成しようとしています。各タスクにキャンセル トークンを渡す必要があります。私は正しい軌道に乗っていますか?非同期を実行するのと同期を実行するにはどうすればよいですか? 私は次のものを持っています:

public int ProcessPendingTransactions()
{

    //set the max # of threads
    ThreadPool.SetMaxThreads(5, 5);

    //create an action
    //The Run method is what i am trying to create multiple tasks in parallel on
    Action action = delegate() { abc.Run(transactionId); };

    //kick off a new thread async
    tfact.StartNew(action, MyCTkn, TaskCreationOptions.None, (TaskScheduler)null);    
}
4

1 に答える 1

2

それぞれ 1 秒で完了する ( DoSomething ) 200 個のアクションを作成し、それらを 25 スレッドで並列に実行するとします。その後、約 8 秒かかります (理論上)。

async void MainMethod()
{
    var sw = Stopwatch.StartNew();

    //Create Actions
    var actions = Enumerable.Range(0,200)
                            .Select( i=> ((Action)(()=>DoSomething(i))));

    //Run all parallel with 25 Tasks-in-parallel
    await DoAll(actions, 25);

    Console.WriteLine("Total Time: " + sw.ElapsedMilliseconds);
}


void DoSomething(int i)
{
    Thread.Sleep(1000);
    Console.WriteLine(i + " completed");
}

async Task DoAll(IEnumerable<Action> actions, int maxTasks)
{
    SemaphoreSlim semaphore = new SemaphoreSlim(maxTasks);

    foreach(var action in actions)
    {
        await semaphore.WaitAsync().ConfigureAwait(false);
        Task.Factory.StartNew(() =>action(), TaskCreationOptions.LongRunning)
                    .ContinueWith((task) => semaphore.Release());
    }

    for (int i = 0; i < maxTasks; i++)
        await semaphore.WaitAsync().ConfigureAwait(false);
}
于 2014-12-12T22:37:31.383 に答える