Показаны сообщения с ярлыком Task Parallel Library. Показать все сообщения
Показаны сообщения с ярлыком Task Parallel Library. Показать все сообщения

воскресенье, 27 октября 2013 г.

Асинхронная загрузка данных с индикацией

Я как-то уже затрагивал тему асинхронной загрузки данных в своей статье TaskExtensions в помощь. Однако, используя такой подход, код со временем начинал обрастать огромным количеством callback'ов и командами. Чтобы оптимизировать данный процесс для своих нужд я сделал класс, которым и хочу поделиться. Ничего нового в нем нет, однако, он позволил сократить огромное количество кода и на мой взгляд является весьма интересным.
Суть класса такова: предоставить пользователю коллекцию динамических данных с выдачей уведомлений при обновлении, а также обеспечить механизм индикации загрузки данных, при этом выбор источника данных предоставить потребителю.
Самый классический сценарий для UI-девелопера: список объектов и кнопка "Обновить". Я решил совместить это в одной коллекции:

public sealed class AsyncObservableCollection<T> : ObservableCollection<T>, ICommand
{
    private readonly Func<Object, Task<IEnumerable<T>>> factory;

    public AsyncObservableCollection(Func<Object, Task<IEnumerable<T>>> factory)
    {
        this.factory = factory;
    }
}

пятница, 18 января 2013 г.

Task Extensions в помощь

При разработке пользовательского интерфейса очень часто возникают ситуации, когда требуется получить некторые данные из различных источников (база данных, web-сервис, wcf-сервис и т.д.). При этом хорошим тоном будет отображать пользователю, что приложение выполняет запрос, а не "вешать" приложение до окончания выполнения операции. Соответственно выход из этой ситуации - запускать процессы получения данных в отдельных потоках.



Помимо того, что иногда будет требоваться передать данные в поток, так их еще нужно получить обратно в UI-поток и обработать, если есть, возникшие во время запроса ошибки. Задача не из простых. Но если использовать класс Task из .NET Framework 4, то задача немного упрощается, так как специально для этого класса я сделал несколько методов расширений, которые очень помогают в решении вышеописанных задач: