Что лучше для многоядерного оборудования? многопоточность или асинхронные методы - PullRequest
1 голос
/ 19 мая 2010

Нам нужно разработать приложение для приборной панели для гигантского экрана. Что он делает, так это собирает все KPI (ключевые показатели эффективности) и показывает их на гигантском экране в реальном времени, чтобы лидеры управления знали, что происходит.

Таким образом, гигантский экран будет иметь от 20 до 30 независимых графиков и круговых диаграмм (число может скоро увеличиться), данные должны обновляться в течение настраиваемого промежутка времени. Технически это означает много обращений к базе данных для извлечения данных и уведомления об изменениях данных в графическом интерфейсе. Поскольку существует множество отдельных графиков для обновления, я не хочу обновлять их синхронно, потому что длительный запрос к базе данных одного графика задержит обновление другого графика.

Итак, у меня есть два варианта,

  1. Выполнение вызовов базы данных, вычислений и уведомление GUI об изменениях данных в отдельном потоке / задаче для каждого графика.
  2. Запись всех вызовов базы данных как асинхронных методов, выполнение вычислений и уведомление GUI в обратных вызовах

Хотя любой из методов будет достаточным для этой цели, я хочу знать, какое решение лучше, особенно учитывая тот факт, что аппаратное обеспечение имеет 16 ядер. Каковы преимущества и недостатки обоих этих методов? или есть ли лучший подход к этой проблеме?

Мы планируем использовать .NET 4.0 и WPF для UI & C # в качестве языка разработки.

Ответы [ 3 ]

5 голосов
/ 19 мая 2010

Я думаю, что ключевые моменты о двух методах следующие:

  • Многопоточный подход ограничивает количество операций, которые вы можете выполнять параллельно, поскольку потоки являются относительно дорогими ресурсами. Однако, если вам нужно что-то вроде ~ 20 потоков, у вас не будет никаких проблем. Это может быть проще написать в C #, потому что вы можете использовать обычный стиль последовательного программирования.

  • Асинхронные вызовы позволяют выполнять гораздо большее количество операций, связанных с вводом / выводом, «параллельно», поскольку каждый вызов не занимает весь поток, поэтому это более эффективно и также выгодно из нескольких ядер в системе (потому что асинхронные операции обрабатываются с использованием пула потоков). Это может быть более сложно использовать из C #, потому что вам нужно использовать методы APM, такие как BeginXyz (что затрудняет кодирование некоторых обычных шаблонов программирования).

Вы можете использовать некоторые расширенные библиотеки для написания асинхронного кода на C # - например, AsynchronousEnumerator дает вам относительно удобный стиль программирования. Вы также можете рассмотреть возможность использования F # с асинхронными рабочими процессами и параллельной передачей сообщений , что, скорее всего, идеально подойдет для вашей проблемы.

2 голосов
/ 19 мая 2010

Я рекомендую использовать PLINQ и параллельную библиотеку задач , если это возможно. Они включают в себя оптимальное разбиение, масштабирование потоков и кражу работы - все встроенное.

0 голосов
/ 19 мая 2010

Каждый из этих методов будет использовать многопоточность для достижения вашей цели.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...