Асинхронное ожидание завершения нескольких потоков
У меня есть блок кода, к которому в конечном итоге получают доступ несколько потоков. Я ищу современный асинхронный механизм, чтобы продолжить выполнение, когда все потоки пройдены.
В настоящее время я делаю следующее с 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
? Более подробное объяснение поможет более конкретному ответу.