Привет, я хотел бы скачать изображения из сети в параллельном цикле foreach.
У меня есть словарь с подписью IDictionary<string,user>
.Класс пользователя имеет два свойства:
Uri ProfilePhoto
BitmapImage ProfilePhotoAsBitmapImage
Моя цель - пройти словарь в цикле, если ProfilePhoto имеет нулевое значение. Я получаю аватар по умолчанию, но не хочу загружать изображение из Интернета асинхронно.
private void GetProfilePhotosFromServer(IEnumerable<UserInfo> friends)
{
Parallel.ForEach(friends, f =>
{
//get defualt
if (f.ProfilePhoto == null)
f.ProfilePhotoAsBitmap = CreateDefaultAvatar(f.Sex);
//start downloading from web server asynchronly
//problem is that I don’t know how retrieve BitmapImage object from
//StartDownloading method or method ProcessImage, which is on the bottom
//of my question
var image = StartDownloadingImage(f.MediumProfilePhoto);
image.Freeze();
f.ProfilePhotoAsBitmap = image;
});
}
Проблема в том, что я не знаю, как извлечь объект BitmapImage из метода StartDownloading или метода ProcessImage, который находится внизу моего вопроса.
Запустить веб-запрос:
private void StartDownloadingImage(Uri imageUri)
{
_webRequest = WebRequest.Create(imageUri);
_webRequest.BeginGetResponse(this.ProcessImage, null);
//how retrieve result of ProcessImage method
}
После завершения веб-запроса я вызываю этот метод:
private void ProcessImage(IAsyncResult asyncResult)
{
var response = _webRequest.EndGetResponse(asyncResult);
using (var stream = response.GetResponseStream())
{
var buffer = new Byte[response.ContentLength];
int offset = 0, actuallyRead = 0;
do
{
actuallyRead = stream.Read(buffer, offset, buffer.Length - offset);
offset += actuallyRead;
}
while (actuallyRead > 0);
var image = new BitmapImage
{
CreateOptions = BitmapCreateOptions.None,
CacheOption = BitmapCacheOption.OnLoad
};
image.BeginInit();
image.StreamSource = new MemoryStream(buffer);
image.EndInit();
//problem
return image;
}
}
Объект BitmapImage создается в методе ProcessImage. Как передать этот объект в свойство od Пользовательский объект, который используется в методе GetProfilePhotosFromServer?
Метод выше, созданный из объекта MemoryStream BitampImage.