Асинхронное ожидание завершения нескольких потоков

У меня есть блок кода, к которому в конечном итоге получают доступ несколько потоков. Я ищу современный асинхронный механизм, чтобы продолжить выполнение, когда все потоки пройдены.

В настоящее время я делаю следующее с CountDownEvent, который работает просто отлично (без поддержки асинхронности).

    public class Watcher
{
    private static readonly Logger Log = LogManager.GetCurrentClassLogger();

    private readonly CountdownEvent _isUpdating = new CountdownEvent(1);
    private readonly IActivity _activity;

    public Watcher([NotNull] IActivity activity)
    {
        _activity = activity ?? throw new ArgumentNullException(nameof(activity));
        _activity.Received += OnReceived;
    }

    private void OnReceived(IReadOnlyCollection<Summary> summaries)
    {
        _isUpdating.AddCount();

        try
        {
            // Threads processing
        }
        finally
        {
            _isUpdating.Signal();
        }
    }

    private void Disable()
    {
        _activity.Received -= OnReceived;

        _isUpdating.Signal();

        /* await */ _isUpdating.Wait();
    }
}

Нужно ли мне использовать какую-либо из этих реализаций AsyncCountdownEvent или есть какой-либо другой встроенный механизм? Я уже думал об использовании BufferBlock, потому что он имеет асинхронную функциональность, но я думаю, что это немного излишне.

Дополнительно к комментариям:

IActivity - это вызов WebService (но он не должен влиять на реализацию сверху или наоборот)

        public async Task Start(bool alwayRetry = true, CancellationToken cancellationToken = new CancellationToken())
    {
        var milliseconds = ReloadSeconds * 1000;

        do
        {
            try
            {
                var summaries = await PublicAPI.GetSummariesAsync(cancellationToken).ConfigureAwait(false);
                OnSummariesReceived(summaries);
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);

                OnErrorOccurred(ex);
            }

            await Task.Delay(milliseconds, cancellationToken).ConfigureAwait(false);
            // ReSharper disable once LoopVariableIsNeverChangedInsideLoop
        } while (alwayRetry);
    }

1 ответ

Не понятно IActivity подписи; но вы можете дождаться завершения ряда задач:

class MultiAsyncTest {

    Task SomeAsync1() { return Task.Delay(1000); }

    Task SomeAsync2() { return Task.Delay(2000);}

    Task EntryPointAsync() {
        var tasks = new List<Task>();
        tasks.Add(SomeAsync1());
        tasks.Add(SomeAsync2());
        return Task.WhenAll(tasks);
    }

}

какой IActivityподпись? Поддерживает ли это Task? Или вы используете Thread? Более подробное объяснение поможет более конкретному ответу.

Другие вопросы по тегам