[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/tgoessler/TCSystemCS/develop/Thread/MultipleTasksExecute.cs [Back]  [Original]

// *******************************************************************************
// 
//  *******   ***   ***               *
//     *     *     *                  *
//     *    *      *                *****
//     *    *       ***  *   *   **   *    **    ***
//     *    *          *  * *   *     *   ****  * * *
//     *     *         *   *      *   * * *     * * *
//     *      ***   ***    *     **   **   **   *   *
//                         *
// *******************************************************************************
//  see https://github.com/tgoessler/TCSystemCS for details.
//  Copyright (C) 2003 - 2026 Thomas Goessler. All Rights Reserved.
// *******************************************************************************
// 
//  TCSystem is the legal property of its developers.
//  Please refer to the COPYRIGHT file distributed with this source distribution.
// 
// *******************************************************************************

#region Usings

using System;
using System.Threading;
using System.Threading.Tasks;

#endregion

namespace TCSystem.Thread;

internal sealed class MultipleTasksExecute(int _maxNumberOfTasks) : IMultipleTasksExecute
{
#region Public

    public void ExecuteCommand(Action action)
    {
        ExecuteCommandInternal(action, null);
    }

    public void ExecuteCommand(Action action, CancellationToken token)
    {
        ExecuteCommandInternal(action, token);
    }

    public void WaitAllDone()
    {
        WaitAllDoneInternal(null);
    }

    public void WaitAllDone(CancellationToken token)
    {
        WaitAllDoneInternal(token);
    }

#endregion

#region Private

    private void WaitAllDoneInternal(CancellationToken? token)
    {
        while (_semaphore.CurrentCount != _maxNumberOfTasks)
        {
            if (token.HasValue)
            {
                Task.Delay(100).Wait(token.Value);
            }
            else
            {
                Task.Delay(100).Wait();
            }
        }
    }

    private void ExecuteCommandInternal(Action action, CancellationToken? token)
    {
        if (token.HasValue)
        {
            _semaphore.Wait(token.Value);
        }
        else
        {
            _semaphore.Wait();
        }

        Task.Run(() =>
        {
            try
            {
                action();
            }
            finally
            {
                _semaphore.Release();
            }
        });
    }

    private readonly SemaphoreSlim _semaphore = new(_maxNumberOfTasks, _maxNumberOfTasks);

#endregion
}

Web Proxy Viewer  |  New URL  |  Original Page