У меня есть служба в моем ServiceStack API для обработки результатов изображения, реализуя IStreamWriter WriteTo (поток). Прекрасно работает.Как избавиться от результата InMemory Cached в ServiceStack
Чтобы оптимизировать обработку, я добавляю поддержку кэш-памяти InMemory, а TimeSpan истекает. Моя забота связана с IDispose. До реализации кэша я использовал IDispose для удаления объекта результата и его образа после его возвращения, но с кэшем inmemory он не может реализовать IDispose, в противном случае данные будут удалены до того, как они будут извлечены из кеша.
Вопрос в том, как или где реализовать реализацию кэшированных результатов? Будет ли кеш располагать элементы по истечении срока действия? Если да, то как реализовать Dispose только для вызовов из диспетчера кэша, но не из обработчика http.
public class ImageResult : IDisposable, IStreamWriter, IHasOptions
{
private readonly Image image;
public void WriteTo(Stream responseStream)
{
image.Save(responseStream, imgFormat);
}
public void Dispose()
{
// if we dispose here, will be disposed after the first result is returned
// want the image to be disposed on cache expiration
//if (this.image != null)
// this.image.Dispose();
}
}
public class ImageService : AssetService
{
public object Get(ImageRequest request)
{
var cacheKey = ServiceStack.Common.UrnId.Create<ImageRequest>(request.id);
if (Cache.Get<ImageResult>(cacheKey) == null)
{
Cache.Set<ImageResult>(cacheKey, GetImage(request), TimeSpan.FromMinutes(1));
}
return Cache.Get<ImageResult>(cacheKey);
}
[...]
}
Я приведу этот снимок и обновит, забавно, как иногда мы забываем о добром деструкторе. (и да, действительно, на излишнем выигрыше - лучше доработать его, как было предложено.) – sirthomas
классный. один (крайний) пример избыточного get вернет вам объект в первом вызове и вернет null во втором вызове, поскольку он истек между вызовами. – Jonno