using System.Threading;
using System.Xml.Serialization;
using System.Net.Http;
+using OpenTween.Connection;
namespace OpenTween
{
public class ImageCache : IDisposable
{
/// <summary>
- /// 画像の取得に使用する HttpClient インスタンス
- /// </summary>
- private readonly HttpClient http;
-
- /// <summary>
/// キャッシュとして URL と取得した画像を対に保持する辞書
/// </summary>
internal LRUCacheDictionary<string, Task<MemoryImage>> innerDictionary;
/// </summary>
private bool disposed = false;
- public ImageCache(HttpClient http)
+ public ImageCache()
{
- this.http = http;
-
this.innerDictionary = new LRUCacheDictionary<string, Task<MemoryImage>>(trimLimit: 300, autoTrimCount: 100);
this.innerDictionary.CacheRemoved += (s, e) => {
// まだ参照されている場合もあるのでDisposeはファイナライザ任せ
return Task.Run(() =>
{
- Task<MemoryImage> cachedImageTask = null;
lock (this.lockObject)
{
- innerDictionary.TryGetValue(address, out cachedImageTask);
+ innerDictionary.TryGetValue(address, out var cachedImageTask);
if (cachedImageTask != null)
{
if (force)
{
this.innerDictionary.Remove(address);
-
- if (cachedImageTask.Status == TaskStatus.RanToCompletion)
- cachedImageTask.Result.Dispose();
-
- cachedImageTask.Dispose();
cachedImageTask = null;
}
else
private async Task<MemoryImage> FetchImageAsync(string uri, CancellationToken cancelToken)
{
- using (var response = await this.http.GetAsync(uri, cancelToken).ConfigureAwait(false))
+ using (var response = await Networking.Http.GetAsync(uri, cancelToken).ConfigureAwait(false))
{
- var imageStream = await response.Content.ReadAsStreamAsync()
- .ConfigureAwait(false);
+ response.EnsureSuccessStatusCode();
- return await MemoryImage.CopyFromStreamAsync(imageStream)
- .ConfigureAwait(false);
+ using (var imageStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
+ {
+ return await MemoryImage.CopyFromStreamAsync(imageStream)
+ .ConfigureAwait(false);
+ }
}
}
{
lock (this.lockObject)
{
- Task<MemoryImage> imageTask;
- if (!this.innerDictionary.TryGetValue(address, out imageTask) ||
+ if (!this.innerDictionary.TryGetValue(address, out var imageTask) ||
imageTask.Status != TaskStatus.RanToCompletion)
return null;
lock (this.lockObject)
{
- foreach (var item in this.innerDictionary)
+ foreach (var (_, task) in this.innerDictionary)
{
- var task = item.Value;
- if (task.Status == TaskStatus.RanToCompletion && task.Result != null)
- task.Result.Dispose();
+ if (task.Status == TaskStatus.RanToCompletion)
+ task.Result?.Dispose();
}
this.innerDictionary.Clear();
}
~ImageCache()
- {
- this.Dispose(false);
- }
+ => this.Dispose(false);
}
}