OSDN Git Service

Revert "ImageCacheクラスの排他制御にReaderWriterLockSlimを使用する"
authorKimura Youichi <kim.upsilon@bucyou.net>
Thu, 1 Sep 2016 12:13:23 +0000 (21:13 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Thu, 1 Sep 2016 12:19:34 +0000 (21:19 +0900)
LRUCacheDictionary は参照もスレッドセーフではないので ReaderWriterLockSlim
は使用できない(二度目)

https://osdn.jp/ticket/browse.php?group_id=6526&tid=36584
https://osdn.jp/ticket/browse.php?group_id=6526&tid=36605

This reverts commit 6866861913afdb053718c88cfee0c1c640e7ae98.

OpenTween/ImageCache.cs
OpenTween/Resources/ChangeLog.txt

index 3f60278..fff786f 100644 (file)
@@ -47,7 +47,7 @@ namespace OpenTween
         /// <summary>
         /// innerDictionary の排他制御のためのロックオブジェクト
         /// </summary>
-        private ReaderWriterLockSlim lockObject = new ReaderWriterLockSlim();
+        private object lockObject = new object();
 
         /// <summary>
         /// オブジェクトが破棄された否か
@@ -90,27 +90,28 @@ namespace OpenTween
 
             return Task.Run(() =>
             {
-                if (force)
+                Task<MemoryImage> cachedImageTask = null;
+                lock (this.lockObject)
                 {
-                    using (this.lockObject.BeginWriteTransaction())
-                        this.innerDictionary.Remove(address);
-                }
+                    innerDictionary.TryGetValue(address, out cachedImageTask);
 
-                using (var transaction = this.lockObject.BeginUpgradeableReadTransaction())
-                {
-                    Task<MemoryImage> cachedImageTask;
-                    if (innerDictionary.TryGetValue(address, out cachedImageTask))
-                        return cachedImageTask;
+                    if (cachedImageTask != null)
+                    {
+                        if (force)
+                        {
+                            this.innerDictionary.Remove(address);
+                            cachedImageTask = null;
+                        }
+                        else
+                            return cachedImageTask;
+                    }
 
                     cancelToken.ThrowIfCancellationRequested();
 
-                    using (transaction.UpgradeToWriteLock())
-                    {
-                        var imageTask = this.FetchImageAsync(address, cancelToken);
-                        this.innerDictionary[address] = imageTask;
+                    var imageTask = this.FetchImageAsync(address, cancelToken);
+                    this.innerDictionary[address] = imageTask;
 
-                        return imageTask;
-                    }
+                    return imageTask;
                 }
             }, cancelToken);
         }
@@ -131,7 +132,7 @@ namespace OpenTween
 
         public MemoryImage TryGetFromCache(string address)
         {
-            using (this.lockObject.BeginReadTransaction())
+            lock (this.lockObject)
             {
                 Task<MemoryImage> imageTask;
                 if (!this.innerDictionary.TryGetValue(address, out imageTask) ||
@@ -144,7 +145,7 @@ namespace OpenTween
 
         public void CancelAsync()
         {
-            using (this.lockObject.BeginWriteTransaction())
+            lock (this.lockObject)
             {
                 var oldTokenSource = this.cancelTokenSource;
                 this.cancelTokenSource = new CancellationTokenSource();
@@ -162,7 +163,7 @@ namespace OpenTween
             {
                 this.CancelAsync();
 
-                using (this.lockObject.BeginWriteTransaction())
+                lock (this.lockObject)
                 {
                     foreach (var item in this.innerDictionary)
                     {
@@ -172,10 +173,8 @@ namespace OpenTween
                     }
 
                     this.innerDictionary.Clear();
+                    this.cancelTokenSource.Dispose();
                 }
-
-                this.cancelTokenSource.Dispose();
-                this.lockObject.Dispose();
             }
 
             this.disposed = true;
index 7700c31..e377836 100644 (file)
@@ -3,6 +3,7 @@
 ==== Ver 1.3.5-dev(2016/xx/xx)
  * FIX: UserStreamsが正常に動作しないことがある不具合を修正
  * FIX: 「このユーザーへの@発言を検索」がv1.3.3から機能しなくなっていた不具合を修正
+ * FIX: プロフィール画像のキャッシュ参照時にエラーが発生する不具合を修正
 
 ==== Ver 1.3.4(2016/08/26)
  * FIX: Fav削除時にエラーが発生し操作不能になる不具合を修正