Да, используя этот код, вполне возможно, что два разных запроса ничего не получат от Cache, и, следовательно, оба перезагрузят данные.Если вы хотите избежать этого, вам нужно синхронизировать всю операцию получения данных.
Один из способов синхронизировать доступ - использовать код, подобный следующему:
Dim expensiveToGetData = Cache("ExpensiveDataKey")
If ExpensiveToGetData is nothing then
SyncLock yourLockObject /* YourLockObject should be a Shared object. */
expensiveToGetData = Cache("ExpensiveDataKey")
If expensiveToGetData Is Nothing Then
ExpensiveToGetData = LoadExpensiveDataFromDataSource()
Cache("ExpensiveDataKey") = ExpensiveToGetData
End If
End SyncLock
end If
ProcessExpensiveData(ExpensiveToGetData)
Идея проверки, получили ли мы данные до получения блокировки, состоит в том, чтобы избежать чрезмерной блокировкисреда под высокой нагрузкой.Если его там нет, нам нужно еще раз проверить внутри блокировки, потому что другой поток мог получить данные во время получения блокировки.