В чем разница с использованием async / await и Task для обработки, критичной ко времени? - PullRequest
0 голосов
/ 01 марта 2012

Допустим, у меня есть метод, который постоянно получает входные данные каждые 10 мс, добавляет данные в Queue<T>, другой поток отключается, выполняет некоторую обработку и запись в файл, чтобы все шло хорошо. Причина этого в том, что обработка займет больше 10 мс.

При обновлении этого метода с помощью .Net 4 я бы запустил новую задачу с опцией длительного запуска, чтобы гарантировать создание нового потока. Имейте BlockingCollection<T> для добавления данных и в методе задачи, используйте BlockingCollection вызов GetConsumingEnumerable для обработки данных и записи их в файл.

Во-первых, я не совсем уверен, нужна ли мне Задача для создания нового потока или нет, но из-за моего незнания это кажется наиболее выгодным способом сделать это.

Во-вторых, с введением ключевых слов async и await я мог бы переписать это снова, чтобы при поступлении данных вызывать метод, помеченный async, который выполняет обработку, а затем вызывает await FileStream.WriteAsync. Будет ли это гарантировать, что данные, поступающие с интервалом в 10 мс, обрабатываются нормально, и нет обратного журнала? Я обнаружил, что эти новые ключевые слова не создают новые потоки, а просто как-то своевременно обрабатывают выполнение.

В моем сценарии это будет полезно для меня, или я должен продолжать создавать новые темы с помощью долго выполняющихся Task и BlockingCollection?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

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

Похоже, что подход производителя / потребителя лучше всего подходит для вашей ситуации. Вы можете использовать BlockingCollection<T> с отдельными потоками / задачами, но вы также должны рассмотреть Библиотека потока данных (часть новой поддержки VS Async). Библиотека Dataflow позволяет вам настроить конвейер (или меш), который определяет, как ваши данные проходят через систему; задачи автоматически создаются по мере необходимости.

1 голос
/ 01 марта 2012

Ключевые слова async и await предназначены для того, чтобы помочь вам писать асинхронные вызовы функций / API, которые требуют много времени для ответа. Компилятор переносит вызов в 2 метода: тот, который запускает задачу, и тот, который является обратным вызовом, когда вызов завершен.

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

...