OSDN Git Service

キャッシュ用の画像ダウンロードタスクが同じaddressに対して複数作られてしまう問題を修正
authorspx <spx268@gmail.com>
Mon, 11 Feb 2013 12:39:25 +0000 (21:39 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sun, 24 Feb 2013 08:54:31 +0000 (17:54 +0900)
innerDictionaryをlockする部分が2つに分かれているため、2つ目のlockに至る前に1つ目をスルーしてしまって、複数リクエストを纏められないことがある

OpenTween/ImageCache.cs

index 726ea50..cb2a3cf 100644 (file)
@@ -102,36 +102,33 @@ namespace OpenTween
 
                     if (this.innerDictionary.ContainsKey(address) && !this.innerDictionary[address].IsFaulted)
                         cachedImageTask = this.innerDictionary[address];
-                }
 
-                if (cachedImageTask != null)
-                    return cachedImageTask;
+                    if (cachedImageTask != null)
+                        return cachedImageTask;
 
-                cancelToken.ThrowIfCancellationRequested();
+                    cancelToken.ThrowIfCancellationRequested();
 
-                using (var client = new OTWebClient() { Timeout = 10000 })
-                {
-                    var imageTask = client.DownloadDataAsync(new Uri(address), cancelToken).ContinueWith(t =>
+                    using (var client = new OTWebClient() { Timeout = 10000 })
                     {
-                        MemoryImage image = null;
-                        if (t.Status == TaskStatus.RanToCompletion)
+                        var imageTask = client.DownloadDataAsync(new Uri(address), cancelToken).ContinueWith(t =>
                         {
-                            image = MemoryImage.CopyFromBytes(t.Result);
-                        }
+                            MemoryImage image = null;
+                            if (t.Status == TaskStatus.RanToCompletion)
+                            {
+                                image = MemoryImage.CopyFromBytes(t.Result);
+                            }
 
-                        if (t.Exception != null)
-                            t.Exception.Handle(e => e is WebException);
+                            if (t.Exception != null)
+                                t.Exception.Handle(e => e is WebException);
 
-                        // FIXME: MemoryImage.Dispose() が正しいタイミングで呼ばれるように修正すべき
-                        return image;
-                    }, cancelToken);
+                            // FIXME: MemoryImage.Dispose() が正しいタイミングで呼ばれるように修正すべき
+                            return image;
+                        }, cancelToken);
 
-                    lock (this.lockObject)
-                    {
                         this.innerDictionary[address] = imageTask;
-                    }
 
-                    return imageTask;
+                        return imageTask;
+                    }
                 }
             }, cancelToken).Unwrap();
         }