我的应用程序有一个包含Lazy<BitmapImage>
字段的视图模型。使用对服务器的服务调用填充该字段。在图像很大的情况下,服务器需要几秒钟才能返回图像(实际上是 a byte[]
),因此 UI 被阻止。为了防止这种情况,我将服务调用放在 a 中Task
,以便后台线程获取图像,然后调用OnPropertyChanged
让 UI 知道图像已返回:
Console.WriteLine("Outside Task ThreadID: {0}",
Thread.CurrentThread.ManagedThreadId);
Task.Factory.StartNew(() =>
{
Console.WriteLine("Inside Task ThreadID: {0}", Thread.CurrentThread.ManagedThreadId);
return Utilities.ConvertByteToImage(
SessionService.GetUserInformation(UserInfo.From).ProfilePicture);
}).ContinueWith(resultToken =>
{
m_lazyProfilePicture = new Lazy<BitmapImage>(() =>
{
return (resultToken.Result == null) ? Utilities.DefaultProfilePicture.Value : resultToken.Result;
});
OnPropertyChanged("ProfilePicture");
});
我注意到即使在将服务调用放入 aTask
之后,UI 仍然被阻塞。因此添加了这些Console.WriteLine
行以查看线程 ID。令人惊讶的是,它们都报告了相同的线程 ID(这似乎只在这种情况下发生。我在项目中的其他任务中尝试过,它们都报告了不同的 ID)。知道这里发生了什么吗?它与 有什么关系BitmapImage
?出于某种原因,调度程序决定将任务放在同一个线程中,但我不明白为什么。欢迎任何建议!