Akavache GetAndFetchLatest 从不调用 fetchfunc
Akavache GetAndFetchLatest never calls fetchfunc
过去几天与 Akavache 一起工作。我有几种使用 GetAndFetchLatest 方法的方法,但有些方法从不调用 fetchFunc,并且所有函数都随机出现该问题。
public async Task<ChecklistModel> GetChecklistTypes()
{
var ChecklistTypesCache =
BlobCache.LocalMachine.GetAndFetchLatest("ChecklistTypes",
() => GetChecklistTypesRemote(),
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now - offset;
return elapsed > new TimeSpan(hours: 0, minutes: 5, seconds: 0);
});
ChecklistTypesCache.Subscribe(subsribedData =>
{
_checkilstModel = subsribedData;
});
_checkilstModel = await ChecklistTypesCache.FirstOrDefaultAsync();
return _checkilstModel;
}
public async Task<ChecklistModel> GetChecklistTypesRemote()
{
//do something
}
有人遇到过这个问题吗?我需要做其他事情才能工作吗?如何解决这个问题?
"Updated Code"
public async Task<IEnumerable<ChecklistModel.Checklist>>
GetChecklistTypesCache()
{
IEnumerable<ChecklistModel.Checklist> checklistModel = null;
var ChecklistTypesCache =
BlobCache.LocalMachine.GetAndFetchLatest("ChecklistAccessLevels",
() => GetChecklistTypesRemote(),
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now -
offset;
return elapsed > new TimeSpan(hours: 0,
minutes: 5, seconds: 0);
});
ChecklistTypesCache.Subscribe(subsribedData =>
{
checklistModel = subsribedData;
});
checklistModel = await ChecklistTypesCache.FirstOrDefaultAsync();
return checklistModel;
}
public async Task<IEnumerable<ChecklistModel.Checklist>> GetChecklistTypesRemote()
{
//do something
}
GetAndFetchLatest returns 多次。它旨在作为您订阅的可观察对象与 Reactive Extensions 一起使用。 promise/async/await 模式仅 returns 一次。 Rx 现在已经 9 岁多了,非常值得学习 - 请参阅 https://reactiveui.net/concepts
所以要详细说明@Geoffrey Huntley 所说的话,要形成一个回应有点困难,因为你这样做的方式(即使在 Gist 中)并没有真正意义 "Reactively"。如果您要使用 promise/async/await 模式,GetAndFetchLatest 真的没有任何意义...如果您要使用 GetAndFetchLatest,您的代码看起来就像
public IObservable<ChecklistModel.Checklist> GetChecklistTypesCache()
{
return BlobCache.LocalMachine.GetAndFetchLatest("ChecklistAccessLevels",
async () =>
{
if (!await Tools.IsConnected()) return null;
return await GetChecklistTypesRemote();
},
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now - offset;
return elapsed > new TimeSpan(hours: 0, minutes: 0, seconds: 30);
});
}
public async Task<ChecklistModel> GetChecklistTypesRemote()
{
//do something
}
//calling code
//Now this is going to possibly fire twice. Once for the cached version
//and then one for the version from the Func
GetChecklistTypesCache().Subscribe(subsribedData =>
{
List<ChecklistModel.Checklist> checklistCollection = new
List<ChecklistModel.Checklist>();
checklistCollection.Clear();
checklistCollection.Add(subsribedData);
checkilstModel = checklistCollection.ToObservable();
});
如果你想使用 async/await 那么你只需要使用只有 return 一个结果的 Akavache 部分
这些都取自github页面的样本
https://github.com/akavache/Akavache
所以首先你会尝试从缓存中获取你的东西
try {
toaster = await BlobCache.LocalMachine.GetObjectAsync("ChecklistAccessLevels");
} catch (KeyNotFoundException) {
}
如果它不存在,那么你会调用你的 func
if(toaster == null)
toaster = await GetChecklistTypesRemote()
现在将其插入缓存
await BlobCache.LocalMachine.InsertObject("ChecklistAccessLevels", toaster );
但也许 "GetOrFetchObject" 更适合您的目的,因为它只会触发一次并且会处理任务?但是要做出回应有点困难,因为我仍然不太清楚用例。我认为通读 https://reactiveui.net/concepts 会很有用,一旦 Reactive 概念得到更多应用,交互就会更有意义。
过去几天与 Akavache 一起工作。我有几种使用 GetAndFetchLatest 方法的方法,但有些方法从不调用 fetchFunc,并且所有函数都随机出现该问题。
public async Task<ChecklistModel> GetChecklistTypes()
{
var ChecklistTypesCache =
BlobCache.LocalMachine.GetAndFetchLatest("ChecklistTypes",
() => GetChecklistTypesRemote(),
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now - offset;
return elapsed > new TimeSpan(hours: 0, minutes: 5, seconds: 0);
});
ChecklistTypesCache.Subscribe(subsribedData =>
{
_checkilstModel = subsribedData;
});
_checkilstModel = await ChecklistTypesCache.FirstOrDefaultAsync();
return _checkilstModel;
}
public async Task<ChecklistModel> GetChecklistTypesRemote()
{
//do something
}
有人遇到过这个问题吗?我需要做其他事情才能工作吗?如何解决这个问题?
"Updated Code"
public async Task<IEnumerable<ChecklistModel.Checklist>>
GetChecklistTypesCache()
{
IEnumerable<ChecklistModel.Checklist> checklistModel = null;
var ChecklistTypesCache =
BlobCache.LocalMachine.GetAndFetchLatest("ChecklistAccessLevels",
() => GetChecklistTypesRemote(),
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now -
offset;
return elapsed > new TimeSpan(hours: 0,
minutes: 5, seconds: 0);
});
ChecklistTypesCache.Subscribe(subsribedData =>
{
checklistModel = subsribedData;
});
checklistModel = await ChecklistTypesCache.FirstOrDefaultAsync();
return checklistModel;
}
public async Task<IEnumerable<ChecklistModel.Checklist>> GetChecklistTypesRemote()
{
//do something
}
GetAndFetchLatest returns 多次。它旨在作为您订阅的可观察对象与 Reactive Extensions 一起使用。 promise/async/await 模式仅 returns 一次。 Rx 现在已经 9 岁多了,非常值得学习 - 请参阅 https://reactiveui.net/concepts
所以要详细说明@Geoffrey Huntley 所说的话,要形成一个回应有点困难,因为你这样做的方式(即使在 Gist 中)并没有真正意义 "Reactively"。如果您要使用 promise/async/await 模式,GetAndFetchLatest 真的没有任何意义...如果您要使用 GetAndFetchLatest,您的代码看起来就像
public IObservable<ChecklistModel.Checklist> GetChecklistTypesCache()
{
return BlobCache.LocalMachine.GetAndFetchLatest("ChecklistAccessLevels",
async () =>
{
if (!await Tools.IsConnected()) return null;
return await GetChecklistTypesRemote();
},
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now - offset;
return elapsed > new TimeSpan(hours: 0, minutes: 0, seconds: 30);
});
}
public async Task<ChecklistModel> GetChecklistTypesRemote()
{
//do something
}
//calling code
//Now this is going to possibly fire twice. Once for the cached version
//and then one for the version from the Func
GetChecklistTypesCache().Subscribe(subsribedData =>
{
List<ChecklistModel.Checklist> checklistCollection = new
List<ChecklistModel.Checklist>();
checklistCollection.Clear();
checklistCollection.Add(subsribedData);
checkilstModel = checklistCollection.ToObservable();
});
如果你想使用 async/await 那么你只需要使用只有 return 一个结果的 Akavache 部分
这些都取自github页面的样本 https://github.com/akavache/Akavache
所以首先你会尝试从缓存中获取你的东西
try {
toaster = await BlobCache.LocalMachine.GetObjectAsync("ChecklistAccessLevels");
} catch (KeyNotFoundException) {
}
如果它不存在,那么你会调用你的 func
if(toaster == null)
toaster = await GetChecklistTypesRemote()
现在将其插入缓存
await BlobCache.LocalMachine.InsertObject("ChecklistAccessLevels", toaster );
但也许 "GetOrFetchObject" 更适合您的目的,因为它只会触发一次并且会处理任务?但是要做出回应有点困难,因为我仍然不太清楚用例。我认为通读 https://reactiveui.net/concepts 会很有用,一旦 Reactive 概念得到更多应用,交互就会更有意义。