Re[13]: Объясните поведение ContinueWith(..., TaskContinuatio
От: TK Лес кывт.рф
Дата: 08.01.17 16:40
Оценка:
Здравствуйте, 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;
}
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.