Подтвердить что ты не робот

Должен ли я заметить разницу в использовании Task vs Threads в .NET 4.0?

Я обновил свой код, чтобы использовать задачи вместо потоков....

Глядя на использование памяти и процессор, я не замечаю никаких улучшений на многоядерном ПК. Ожидается ли это?

Мое приложение по существу запускает потоки/задачи в разных объектах при его запуске...

Все, что я делаю, это простой

Task a = new Task(...)
a.Start();
4b9b3361

Ответ 1

Существуют различные последствия для использования задач вместо потоков, но производительность не является основной (если вы не создаете огромное количество потоков.) Несколько ключевых отличий:

  • Задача TaskScheduler будет использовать пул потоков, поэтому некоторые задачи могут не запускаться до тех пор, пока не будут выполнены другие ожидающие задачи. Если вы используете Thread напрямую, каждое использование начнет новый Thread.
  • Когда в Задаче возникает исключение, оно завершается в исключение AggregateException, которое может получить код вызова, когда он ждет завершения задачи или если вы зарегистрируете продолжение в Задаче. Это связано с тем, что вы также можете делать такие вещи, как wait on multiple Tasks, и в этом случае можно исключить и агрегировать несколько исключений.
  • Если вы не заметили необработанное исключение, заданное Задачей, оно будет (ну, может быть) в конечном итоге брошено финализатором Задачи, что особенно неприятно. Я всегда рекомендую подключить событие TaskScheduler.UnobservedTaskException, чтобы вы могли, по крайней мере, регистрировать эти сбои до того, как приложение взорвется. Это отличается от исключений Thread, которые отображаются в событии AppDomain.UnhandledException.

Ответ 2

Если вы просто заменили каждое использование Thread на Task и не сделали никаких других изменений, я ожидал бы практически такую ​​же производительность. API-интерфейс Task на самом деле - это API-интерфейс над существующим набором конструктов. Под капотом он использует потоки для планирования его действий и, следовательно, имеет схожие характеристики.

Что хорошего в Task - это новые вещи, которые вы можете с ними сделать

  • Состав с ContinueWith
  • Отмена
  • Иерархии
  • Etc...

Ответ 3

Одним из больших улучшений Takss vs. Threads является то, что вы можете легко создавать цепочки задач. Вы можете указать, когда задача должна начинаться после предыдущей задачи ( "OnSuccess", "OnError", a.s.o.), и вы можете указать, должен ли быть переключатель контекста синхронизации. Это дает вам прекрасную возможность запускать многолетнюю задачу в bakcground, а после этого пользовательский интерфейс выполняет задачу по потоку пользовательского интерфейса.

Ответ 4

Если вы используете .Net 4.0, вы можете использовать метод Parallel.Invoke, например:

Parallel.Invoke(()=> {
    // What ever code you add here will get threaded.
});

для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/dd992634.aspx

Ответ 5

Вы увидите разницу, если ваш исходный или преобразованный код не выполняет полностью отключает процессор. То есть если исходный код всегда ограничивал количество потоков до 2, на четырехъядерном компьютере он будет загружаться с нагрузкой около 50% с создаваемыми вручную потоками и потенциально 100% нагрузкой с задачами (если ваши задачи могут быть паралелизованы). Таким образом, похоже, что либо ваш исходный код был разумным с точки зрения производительности, либо оба объекта страдают от проблем, демонстрирующих аналогичное недоиспользование процессора.