Здравствуйте, AK107, Вы писали:
AK>а тут я не понял как нам это поможет во FlushAsync дождаться полного цикла обработки info включая его удаление из pendingEvents — это к вопросу о текущей реализациии порядка срабатывания продолжений в .net о чем вы писали выше. в список так и добавляется оригинальный task, соответственно дожидаться во FlushAsync будут именно его, а продолжения:
AK>цель была: в идеале FlushAsync дожидается не только завершения асинхронной записи info, но и удаления из pendingEvents. изначально я считал, что TaskContinuationOptions.ExecuteSynchronously дает некие гарантии, на что меня поправили — "в текущей реализации, которая может измениться"...
Если надо просто дождаться завершения всех на текущий момент добавленных тапок то, во FlushAsync можно просто подменить коллекцию pendingEvents на новую и спокойно дождаться завершения всех тапок по старой. Единственное добавление тогда чуть более замороченное будет.
Или например с ActionBlock:
ActionBlock<Task> _currentBlock = new ActionBlock<Task>(task => task);
void Add() {
var task = WriteAsync();
while (!_currentBlock.Post(task)) {
Interlocked.CompareExchange(ref _currentBlock, new ActionBlock<Task>(task => task), _currentBlock);
}
}
void Flush() {
var currentBlock = _currentBlock;
currentBlock.Complete();
await currentBlock.Completition;
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.