Ноябрь
13
2012

Параллельное и асинхронное программирование в .NET 4.5

Параллельное и асинхронное программирование в .NET 4.5

С выходом .NET 4.5 в синтаксис C# ввели два новых слова async и await, которые служат соответственно для объявления операции асинхронной и для получения результата такой асинхронной операции.

Вместе с тем большинство операций с внешними источниками (файлы, сеть и т.д.) превели к асинхронному виду.

Например при разработке приложения для контакта я столкнулся с ситуацией, когда нужно создать целую коллекцию объектов (пользователи, записи на стене и т.д.) и скачать к ним файлы с внешнего сервера (аватарки, вложения и т.д.). Создание одного такого объекта в среднем занимает 0,2 секунды, что вроде не много, но когда нужно показать всех друзей и соответственно создать сразу более сотни таких объектов, время на формирование растет пропорционально. К счастью такие операции можно выполнять параллельно.

Для начала простой класс для примера

Он содержит конструктор, асинхронный метод для загрузки аватарки с внешнего сайта и статический асинхронный метод, который делает полностью готовый объект пользователя.

Теперь посмотрим как сделать синхронное создание списка объектов.

 

В умных книжках предлагают для распаралеливания использовать конструкцию Parallel.ForEach()

Решение красивое, но у меня с ним возникли некоторые трудности.

Во первых возникали ошибки при создании

Быстрое гугление показало, что BitmapImage как-то странно работает в параллельных задачах.

Во вторых я получал не все результаты, например у меня вконтакте 159 друзей, в в списке users содержалось меньше записей, причем при каждом запуске это число было разным, но в пределах 150-158 штук.

Пришлось переписывать логику хитрым способом

Таким образом у нас есть список заданий по созданию объектов пользователей usersCreatingTask, которое мы заполняем заданиями по созданию объектов. Когда одно из заданий завершается, мы удаляем его из списка, а результат используем. И так пока задания в списке не закончатся.

Этот подход сразу избавил меня от проблем с new BitmapImage();, а количество созданных объектов точно соответствует количеству входных данных.

Неправильная раскладка: gfhfkktkmyjt b fcby[hjyyjt ghjuhfvvbhjdfybt d .туе 4.5

Понравилась статья? Посоветуйте друзьям!

C# Dev Windows Windows 8


Понравилась статья? Подпишись на рассылку по E-Mail или в RSS.