From edc8a91cae8ce4265df8f0c5a5d41c1fbf5f72c6 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 17 Feb 2014 19:33:28 +0900 Subject: [PATCH] =?utf8?q?TweetThumbnail=E3=81=AE=E6=8E=92=E4=BB=96?= =?utf8?q?=E5=88=B6=E5=BE=A1=E3=81=ABlock=E3=82=B9=E3=83=86=E3=83=BC?= =?utf8?q?=E3=83=88=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- OpenTween/TweetThumbnail.cs | 80 +++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 46 deletions(-) diff --git a/OpenTween/TweetThumbnail.cs b/OpenTween/TweetThumbnail.cs index 9bb45884..37472178 100644 --- a/OpenTween/TweetThumbnail.cs +++ b/OpenTween/TweetThumbnail.cs @@ -46,6 +46,8 @@ namespace OpenTween public event EventHandler ThumbnailDoubleClick; public event EventHandler ThumbnailImageSearchClick; + private object uiLockObj = new object(); + public ThumbnailInfo Thumbnail { get { return this.pictureBox[this.scrollBar.Value].Tag as ThumbnailInfo; } @@ -73,47 +75,50 @@ namespace OpenTween { var thumbnails = t.Result; - this.SetThumbnailCount(thumbnails.Count); - if (thumbnails.Count == 0) return; - - for (int i = 0; i < thumbnails.Count; i++) + lock (this.uiLockObj) { - var thumb = thumbnails[i]; - var picbox = this.pictureBox[i]; + this.SetThumbnailCount(thumbnails.Count); + if (thumbnails.Count == 0) return; - picbox.Tag = thumb; - picbox.ContextMenu = CreateContextMenu(thumb); + for (int i = 0; i < thumbnails.Count; i++) + { + var thumb = thumbnails[i]; + var picbox = this.pictureBox[i]; - picbox.ShowInitialImage(); + picbox.Tag = thumb; + picbox.ContextMenu = CreateContextMenu(thumb); - thumb.LoadThumbnailImageAsync(cancelToken) - .ContinueWith(t2 => - { - if (t2.IsFaulted) - t2.Exception.Flatten().Handle(x => x is WebException || x is InvalidImageException || x is TaskCanceledException); + picbox.ShowInitialImage(); - if (t2.IsFaulted || t2.IsCanceled) + thumb.LoadThumbnailImageAsync(cancelToken) + .ContinueWith(t2 => { - picbox.ShowErrorImage(); - return; - } + if (t2.IsFaulted) + t2.Exception.Flatten().Handle(x => x is WebException || x is InvalidImageException || x is TaskCanceledException); - picbox.Image = t2.Result; - }, - CancellationToken.None, TaskContinuationOptions.AttachedToParent, uiScheduler); + if (t2.IsFaulted || t2.IsCanceled) + { + picbox.ShowErrorImage(); + return; + } - var tooltipText = thumb.TooltipText; - if (!string.IsNullOrEmpty(tooltipText)) - { - this.toolTip.SetToolTip(picbox, tooltipText); + picbox.Image = t2.Result; + }, + CancellationToken.None, TaskContinuationOptions.AttachedToParent, uiScheduler); + + var tooltipText = thumb.TooltipText; + if (!string.IsNullOrEmpty(tooltipText)) + { + this.toolTip.SetToolTip(picbox, tooltipText); + } + + cancelToken.ThrowIfCancellationRequested(); } - cancelToken.ThrowIfCancellationRequested(); + if (thumbnails.Count > 1) + this.scrollBar.Enabled = true; } - if (thumbnails.Count > 1) - this.scrollBar.Enabled = true; - if (this.ThumbnailLoading != null) this.ThumbnailLoading(this, new EventArgs()); }, @@ -177,23 +182,6 @@ namespace OpenTween if (this.task == null || this.task.IsCompleted) return; this.cancelTokenSource.Cancel(); - - // this.task.Status は、GetThumbailInfo() の実行中であれば TaskStatus.WaitingForActivation となる。 - // ContinueWith の処理も含めて終了していれば RanToCompletion などになる。 - // もしこれが Running である場合は、PictureBox に対する操作の途中である可能性が高いため - // 必ず Wait() を実行してタスクの終了を待つ。 - // (ContinueWith のタスクは ThumbnailLoading イベントが足を引っ張らない限り20ms程で完了する) - - if (this.task.Status != TaskStatus.Running) return; - - try - { - this.task.Wait(); - } - catch (AggregateException ae) - { - ae.Handle(e => e is TaskCanceledException); - } } /// -- 2.11.0