From 6d40a276c6d9f663e282667080868ad3e5f1ab10 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Wed, 10 Apr 2013 09:54:38 +0900 Subject: [PATCH] =?utf8?q?Revert=20"ImageCache=E3=81=AE=E6=8E=92=E4=BB=96?= =?utf8?q?=E5=88=B6=E5=BE=A1=E3=82=92=E6=94=B9=E5=96=84"?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This reverts commit f3d6eb2556e7739b167f1f4fd79251b1bb660ac8. LRUCacheDictionaryは参照もスレッドセーフではないため。 --- OpenTween/ImageCache.cs | 63 +++++++++++++++------------------------ OpenTween/Resources/ChangeLog.txt | 1 - 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/OpenTween/ImageCache.cs b/OpenTween/ImageCache.cs index 90192079..56259ff6 100644 --- a/OpenTween/ImageCache.cs +++ b/OpenTween/ImageCache.cs @@ -45,7 +45,7 @@ namespace OpenTween /// /// innerDictionary の排他制御のためのロックオブジェクト /// - private ReaderWriterLockSlim lockObject = new ReaderWriterLockSlim(); + private object lockObject = new object(); /// /// オブジェクトが破棄された否か @@ -54,13 +54,11 @@ namespace OpenTween public ImageCache() { - this.lockObject.EnterWriteLock(); - try + lock (this.lockObject) { this.innerDictionary = new LRUCacheDictionary>(trimLimit: 300, autoTrimCount: 100); - this.innerDictionary.CacheRemoved += (s, e) => - { + this.innerDictionary.CacheRemoved += (s, e) => { // まだ参照されている場合もあるのでDisposeはファイナライザ任せ this.CacheRemoveCount++; @@ -68,7 +66,6 @@ namespace OpenTween this.cancelTokenSource = new CancellationTokenSource(); } - finally { this.lockObject.ExitWriteLock(); } } /// @@ -98,10 +95,12 @@ namespace OpenTween return Task.Factory.StartNew(() => { Task cachedImageTask = null; - this.lockObject.EnterUpgradeableReadLock(); - try + lock (this.lockObject) { - if (!force && this.innerDictionary.ContainsKey(address) && !this.innerDictionary[address].IsFaulted) + if (force) + this.innerDictionary.Remove(address); + + if (this.innerDictionary.ContainsKey(address) && !this.innerDictionary[address].IsFaulted) cachedImageTask = this.innerDictionary[address]; if (cachedImageTask != null) @@ -109,41 +108,34 @@ namespace OpenTween cancelToken.ThrowIfCancellationRequested(); - this.lockObject.EnterWriteLock(); - try + using (var client = new OTWebClient() { Timeout = 10000 }) { - using (var client = new OTWebClient() { Timeout = 10000 }) + var imageTask = client.DownloadDataAsync(new Uri(address), cancelToken).ContinueWith(t => { - var imageTask = client.DownloadDataAsync(new Uri(address), cancelToken).ContinueWith(t => + MemoryImage image = null; + if (t.Status == TaskStatus.RanToCompletion) { - MemoryImage image = null; - if (t.Status == TaskStatus.RanToCompletion) - { - image = MemoryImage.CopyFromBytes(t.Result); - } + 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); - this.innerDictionary[address] = imageTask; + this.innerDictionary[address] = imageTask; - return imageTask; - } + return imageTask; } - finally { this.lockObject.ExitWriteLock(); } } - finally { this.lockObject.ExitUpgradeableReadLock(); } }, cancelToken).Unwrap(); } public MemoryImage TryGetFromCache(string address) { - this.lockObject.EnterReadLock(); - try + lock (this.lockObject) { if (!this.innerDictionary.ContainsKey(address)) return null; @@ -154,18 +146,15 @@ namespace OpenTween return imageTask.Result; } - finally { this.lockObject.ExitReadLock(); } } public void CancelAsync() { - this.lockObject.EnterWriteLock(); - try + lock (this.lockObject) { this.cancelTokenSource.Cancel(); this.cancelTokenSource = new CancellationTokenSource(); } - finally { this.lockObject.ExitWriteLock(); } } protected virtual void Dispose(bool disposing) @@ -176,8 +165,7 @@ namespace OpenTween { this.CancelAsync(); - this.lockObject.EnterWriteLock(); - try + lock (this.lockObject) { foreach (var item in this.innerDictionary) { @@ -189,9 +177,6 @@ namespace OpenTween this.innerDictionary.Clear(); this.cancelTokenSource.Dispose(); } - finally { this.lockObject.ExitWriteLock(); } - - this.lockObject.Dispose(); } } diff --git a/OpenTween/Resources/ChangeLog.txt b/OpenTween/Resources/ChangeLog.txt index 1010823d..594d8b94 100644 --- a/OpenTween/Resources/ChangeLog.txt +++ b/OpenTween/Resources/ChangeLog.txt @@ -2,7 +2,6 @@ ==== Ver 1.1.0-beta1(2013/xx/xx) * NEW: タブの表示位置を画面上部に変更可能に (thx @aokomoriuta!) - * CHG: アイコン読み込み処理の速度改善 * FIX: スペースが含まれているURLをブラウザで開こうとするとURLが分断されて複数のタブが開いてしまう問題を修正 (thx @5px!) * FIX: 画面更新時にInvalidOperationExceptionのエラーが発生する不具合を修正 -- 2.11.0