protected Task<T> GetAsync<T>(
Func<CancellationToken, Task<T>> tryGetFuncAsync,
Func<CancellationToken, Task<T>> fillAndGetFuncAsync,
bool optimizeAtomicTryGet = false,
CancellationToken cancellationToken = default
)
where T : class
Protected Function GetAsync(Of T As Class) (
tryGetFuncAsync As Func(Of CancellationToken, Task(Of T)),
fillAndGetFuncAsync As Func(Of CancellationToken, Task(Of T)),
Optional optimizeAtomicTryGet As Boolean = false,
Optional cancellationToken As CancellationToken = Nothing
) As Task(Of T)
protected:
generic<typename T>
where T : ref class
Task<T>^ GetAsync(
Func<CancellationToken, Task<T>^>^ tryGetFuncAsync,
Func<CancellationToken, Task<T>^>^ fillAndGetFuncAsync,
bool optimizeAtomicTryGet = false,
CancellationToken cancellationToken = CancellationToken()
)
member GetAsync :
tryGetFuncAsync : Func<CancellationToken, Task<'T>> *
fillAndGetFuncAsync : Func<CancellationToken, Task<'T>> *
?optimizeAtomicTryGet : bool *
?cancellationToken : CancellationToken
(* Defaults:
let _optimizeAtomicTryGet = defaultArg optimizeAtomicTryGet false
let _cancellationToken = defaultArg cancellationToken new CancellationToken()
*)
-> Task<'T> when 'T : not struct
Функция, осуществляющая чтение из локального кэша вне блокировок между процессами. Для передачи параметров следует использовать замыкание. Функция возвращает null, если значение прочитать не удалось и требуется наполнение локального кэша из внешнего источника.
Обращение к локальному кэшу потокобезопасно и может проводиться без дополнительной синхронизации.
Функция, выполняющая наполнение локального кэша из внешнего источника и возвращающая значение, запрошенное из кэша после его наполнения. Для передачи параметров следует использовать замыкание.
Обращение к локальному кэшу потокобезопасно и может проводиться без дополнительной синхронизации. Однако, нет гарантии, что значение, отсутствовавшее в локальном кэше в функции tryGetFuncAsync, будет так же отсутствовать при выполнении этой функции. Поэтому функция должна осуществлять добавление или замену необходимых данных, а не только добавление.
Флаг оптимизации атомарных обращений к кэшу.
При включении этого флага метод tryGetFuncAsync может выполняться дважды. При этом, первый вызов метода будет происходить без взятия блокировок и для него не гарантируется потокобезопасность.
Перед использованием этого флага убедитесь, что методы tryGetFuncAsync и InvalidateLocalCacheOverrideAsync(TEventArgs, CancellationToken) потокобезопасны.
Выполнение метода может занять продолжительное время из-за глобальной синхронизацией между процессами, поэтому кэш должен запрашивать максимальный объём данных за раз.
Метод не является потокобезопасным. Потокобезопасным является только доступ к локальному кэшу в методах tryGetFuncAsync и fillAndGetFuncAsync.