Практические различия между использованием TPL и Async Pattern - PullRequest
3 голосов
/ 15 июня 2010

Я собираюсь использовать любой из упомянутых способов работы с долго выполняющимися операциями.

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

У меня есть набор методов, связанных с HTTP, каждый из которых получает несколько частей информации.Все это является частью большей системы внутри долго работающей службы (так что это не какой-то одноразовый, одноразовый код).

В общем, какой подход лучше, инкапсуляция и ремонтопригодность: обработка возвращаемых данныхкогда он будет готов с использованием механизма Begin / End / AsyncCallback или путем запуска событий из задач, таких как OnXXXReceived, OnXXXError, с использованием производных классов EventArgs для каждого события?

Надеюсь, я был достаточно ясен ... Я решил непредоставить примеры кода, так как меня больше интересуют мнения, советы и возможные подводные камни, чем лакомые кусочки конкретной реализации.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

В целом, задачи TPL намного проще в использовании.В вашем случае создайте их, используя опции Factory и LongRunning.

Хотя я не уверен в событиях.Почему бы не обработать запрос / ответ в цикле или что-то подобное?Вы уже в теме.

1 голос
/ 12 сентября 2010

Вы просто не можете превзойти модель асинхронного программирования (APM), когда дело доходит до производительности ввода-вывода. В любое время вы можете использовать его, вы должны быть. К счастью, Task Parallel Library (TPL) поставляется с поддержкой baked для поддержки объединения работы APM в микс с «чистыми» задачами TPL через фабричный метод FromAsync .

Ознакомьтесь с этим разделом .NET SDK для MSDN, озаглавленным TPL и традиционное .NET для асинхронного программирования , чтобы получить дополнительную информацию о том, как объединить эти две модели программирования для достижения асинхронной нирваны.

1 голос
/ 15 августа 2010

Вы также можете использовать ContinuationTasks для обработки данных после завершения задачи извлечения.

    Task<StockDataCollection> loadFedHistoricalData =
        Task<StockDataCollection>.Factory.StartNew(
            () => LoadFedHistoricalData(),
            TaskCreationOptions.LongRunning);

    Task<StockDataCollection> normalizeHistoricalData =
        loadFedHistoricalData.ContinueWith(
            (t) => NormalizeData(t.Result));

В этом коде задача loadFedHistoricalData запускает LoadFedHistoricalData, которая является длительно связанной задачей ввода-вывода. Когда это возвращается, оно продолжается с другой задачей, которая нормализует данные.

ContinueWith принимает параметр TaskContinuationOptions, который можно использовать для указания того, всегда ли выполняется задача продолжения или просто выполняется ли какое-либо условие, например, ошибка или отмена.

Пример главы 5 A-Dash демонстрирует подобный альтернативный подход к событиям. Вы можете скачать код с http://parallelpatterns.codeplex.com/. Посмотрите на классы AnalysisEngine и MainWindowViewModel.

...