class MockThumbnailInfo : ThumbnailInfo
{
- protected override Task<MemoryImage> LoadThumbnailImageAsync()
+ public override Task<MemoryImage> LoadThumbnailImageAsync(CancellationToken token)
{
- return Task.Factory.StartNew(() => MemoryImage.CopyFromBytes(File.ReadAllBytes("Resources/" + this.ThumbnailUrl)));
+ return Task.Factory.StartNew(() => MemoryImage.CopyFromBytes(File.ReadAllBytes("Resources/" + this.ThumbnailUrl)), token);
}
}
}
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
+using System.Threading;
using System.Threading.Tasks;
namespace OpenTween.Thumbnail.Services
public class Thumbnail : ThumbnailInfo
{
- protected override Task<MemoryImage> LoadThumbnailImageAsync()
+ public override Task<MemoryImage> LoadThumbnailImageAsync(CancellationToken token)
{
var client = new OTWebClient();
client.UserAgent = MyCommon.GetUserAgentString(fakeMSIE: true);
client.Headers[HttpRequestHeader.Referer] = this.ImageUrl;
- var task = client.DownloadDataAsync(new Uri(this.ThumbnailUrl))
- .ContinueWith(t => MemoryImage.CopyFromBytes(t.Result));
+ var task = client.DownloadDataAsync(new Uri(this.ThumbnailUrl), token)
+ .ContinueWith(t => MemoryImage.CopyFromBytes(t.Result), token);
task.ContinueWith(_ => client.Dispose());
public class Thumbnail : ThumbnailInfo
{
- protected override Task<MemoryImage> LoadThumbnailImageAsync()
+ public override Task<MemoryImage> LoadThumbnailImageAsync(CancellationToken token)
{
return Task.Factory.StartNew(() =>
{
throw new WebException(statusCode.ToString(), WebExceptionStatus.ProtocolError);
}
},
- CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); // 明示しないと TaskScheduler.Current になり UI スレッド上で実行されてしまう
+ token, TaskCreationOptions.None, TaskScheduler.Default); // 明示しないと TaskScheduler.Current になり UI スレッド上で実行されてしまう
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
namespace OpenTween.Thumbnail
public string TooltipText { get; set; }
public string FullSizeImageUrl { get; set; }
- public readonly Lazy<Task<MemoryImage>> ThumbnailImageTask;
-
- public ThumbnailInfo()
+ public Task<MemoryImage> LoadThumbnailImageAsync()
{
- this.ThumbnailImageTask = new Lazy<Task<MemoryImage>>(this.LoadThumbnailImageAsync);
+ return this.LoadThumbnailImageAsync(CancellationToken.None);
}
- protected virtual Task<MemoryImage> LoadThumbnailImageAsync()
+ public virtual Task<MemoryImage> LoadThumbnailImageAsync(CancellationToken token)
{
var client = new OTWebClient();
- var task = client.DownloadDataAsync(new Uri(this.ThumbnailUrl))
- .ContinueWith(t => MemoryImage.CopyFromBytes(t.Result));
+ var task = client.DownloadDataAsync(new Uri(this.ThumbnailUrl), token)
+ .ContinueWith(t => MemoryImage.CopyFromBytes(t.Result), token);
task.ContinueWith(_ => client.Dispose());
picbox.ContextMenu = CreateContextMenu(thumb);
picbox.ShowInitialImage();
- thumb.ThumbnailImageTask.Value.ContinueWith(t2 =>
+
+ thumb.LoadThumbnailImageAsync(cancelToken)
+ .ContinueWith(t2 =>
{
if (t2.IsFaulted)
- {
t2.Exception.Flatten().Handle(x => x is WebException || x is InvalidImageException);
+
+ if (t2.IsFaulted || t2.IsCanceled)
+ {
picbox.ShowErrorImage();
return;
}
+
picbox.Image = t2.Result;
},
CancellationToken.None, TaskContinuationOptions.AttachedToParent, uiScheduler);