фона:ASP.NET MVC3 как ждать асинхронным обратного вызова и возврата результата
Я работаю на функциональность кэша прогрева, чтобы увеличить производительность на ASP.NET MVC Web путем предварительной загрузки объекта в Кэш до его запроса.
Я использую кеш-ключ Azure In-Role, который предоставил функцию AddItemLevelCallback при обновлении/удалении/добавлении кеша и т. Д. Я поделился логикой кода ниже.
Проблема:
AddItemLevelCallback на NotifyOnceCacheIsUpdated показано на фрагменте кода ниже не становится вызывается сразу, пока не будет добавлен Пункт/обновляется. Запрос нужно будет ждать. Но проблема заключается в том, что AddItemLevelCallback isync и KickOffWarmUpCache в DAL может вернуться до добавления/обновления фактического элемента.
Каким будет элегантный способ справиться с этим сценарием, когда KickOffWarmUpCache возвращает результат только вызывающему абоненту только после запуска AddItemLevelCallback.
Технология: MVC3, .NET Framework 4.5
Пример кода:
CONTROLLER
public void WarmUpCache(string id)
{
var userInfo = BLL.KickOffWarmUpCache(string id);
}
BLL
public UserInfo KickOffWarmUpCache(string id)
{
return DAL.KickOffWarmUpCache(string id)
}
DAL
public UserInfo KickOffWarmUpCache(string id)
{
UserInfo userInfo = new UserInfo();
//If Status = Progress
if (cache.Get(id).Status == "Progress")
{
NotifyOnceCacheIsUpdated(id,(result)=>
{
userInfo=result.userInfo;
});
}else{
userInfo=Cache.Get(id);
}
//This needs to wait for until callback is triggered and userInfo is populated
return userInfo;
}
UTIL
public void NotifyOnceCacheIsUpdated(string cacheKey, Action<T> callback)
{
DataCacheOperations allCacheOperations = DataCacheOperations.ReplaceItem | DataCacheOperations.AddItem ;
_ndItemLvlAllOps = cache.AddItemLevelCallback(cacheKey, allCacheOperations,
(CacheName, cacheRegion, cacheKey, itemVersion, OperationId, nd) =>
{
cachedData = cache.Get(cacheKey);
callback(cachedData);
});
}
Рассматривали вы просто с помощью '' Task' async'? – Aron
Да, но не решит данную проблему I.e. результат ожидания и возврата, заданный функцией обратного вызова –
... Результат ожидания и возврата - это ОТРАЖЕННАЯ ИДЕЯ '' '' '' '' async'. Или ваша проблема в том, что ваша текущая функция не включена в дружественную подпись TPL? Если это так, вы должны завершить логику в 'TaskCompletionSource'. – Aron