Приложението ми има модел на изглед, който съдържа поле 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