В моем приложении есть модель представления, которая содержит поле Lazy<BitmapImage>
. Поле заполняется с помощью служебного вызова на сервер. В случаях, когда изображение большое, серверу требуется несколько секунд, чтобы вернуть изображение (которое на самом деле является byte[]
), поэтому пользовательский интерфейс блокируется. Чтобы предотвратить это, я поместил вызов службы в Task
, чтобы фоновый поток получил изображение, а затем вызвал OnPropertyChanged
, чтобы сообщить пользовательскому интерфейсу, что изображение возвращено:
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
пользовательский интерфейс до сих пор заблокирован. Поэтому добавил эти строки Console.WriteLine
, чтобы увидеть идентификаторы потоков. Удивительно, но оба они сообщают один и тот же идентификатор потока (похоже, это происходит только в этом случае. Я пробовал это с другими задачами в проекте, и все они сообщают разные идентификаторы). Есть идеи, что здесь происходит? Это как-то связано с BitmapImage
? По какой-то причине планировщик решает поставить задачу в этот же поток, но я не понимаю, почему. Любые предложения приветствуются!
Lazy
. Он предназначен для использования, когда делегат стоит дорого, и вы в порядке, когда он блокируется. Но в вашем случае делегат выполняется очень быстро. Вы могли бы использовать толькоBitmapImage
в качестве типа поля. - person svick   schedule 19.09.2013