私のアプリケーションには、フィールドを含むビュー モデルがありLazy<BitmapImage>
ます。このフィールドは、サーバーへのサービス呼び出しを使用して入力されます。画像が大きい場合、サーバーが画像 (実際には a ) を返すのに数秒かかるbyte[]
ため、UI がブロックされます。これを防ぐために、サービス コールを に配置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");
});
サービス コールを に配置した後でもTask
、UI がブロックされるまで気付きました。そのため、これらの行を追加Console.WriteLine
してスレッド ID を確認しました。驚いたことに、両方とも同じスレッド ID を報告しています (これはこの場合にのみ発生するようです。プロジェクトの他のタスクで試してみたところ、すべて異なる ID が報告されました)。ここで何が起こっているのか分かりますか?と何か関係がありBitmapImage
ますか?何らかの理由で、スケジューラーはタスクを同じスレッドに入れることにしましたが、その理由がわかりません。どんな提案も大歓迎です!