Re[6]: Interlocked
От: RushDevion Россия  
Дата: 29.12.18 11:19
Оценка:
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, RushDevion, Вы писали:
RD>> public Task<T> GetValueAsync()
RD>> {

RD>> // Ошибка инициализации? Сбросим текущую таску в null, чтобы перезапуститься при след. обращении

RD>> task.ContinueWith(_ =>
RD>> Interlocked.CompareExchange(ref m_Value, null, task),
RD>> TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously);

RD>> return task;

RD>> }

S>А тут rc не будет случаем? Может continuation прицепить к родителю (task)?

Так оно и цепляется к task
Я возможностей для rc не вижу.

Но тут может быть множественная инициализация.
Если два и более потоков придут одновременно, то каждый из них запустит инициализацию.
Но востребованной будет только одна. Невостребованные либо тихо умрут, либо (худший случай) зафейлятся и улетят в Unobseved Task Exception handler.
Я же сказал, что это идея, а не production code
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.