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

Асинхронные делегаты Vs Thread/ThreadPool?

Мне нужно выполнить 3 параллельные задачи, и после завершения каждой задачи они должны вызывать ту же функцию, которая выводит результаты.

Я не понимаю в .net, почему у нас есть асинхронный вызов (delegate.BeginInvoke() и delegate.EndInvoke()), а также класс Thread?

Я немного запутался, какой из них использовать, когда? Теперь в этом конкретном случае, что я должен использовать асинхронный вызов или класс Thread?

Я использую С#.

4b9b3361

Ответ 1

1. Асинхронные делегаты

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

BackgroundWorker vs background Thread

2. BackgroundWorker

  • Использовать BackgroundWorker, если у вас есть одна задача, которая выполняется в фон и необходимо взаимодействовать с пользовательский интерфейс. и использовать его, если вам все равно, когда они закончат свою задачу. Задача сортировки данных и вызовы методов для потока пользовательского интерфейса автоматически обрабатывается через основанной на событиях.
  • Избегайте BackgroundWorker, если (1) ваша сборка еще не выполнена ссылаться на System.Windows.Form сборка, (2) вам понадобится нить для быть на переднем плане, или (3) вы нужно манипулировать нитью приоритет.

3. ThreadPool

  • Используйте поток ThreadPool, когда требуется эффективность. ThreadPool помогает избежать накладных расходов с созданием, запуском и остановкой потоки.
  • Избегайте использования ThreadPool, если (1) задача выполняется на протяжении всей жизни вашего приложение, (2) вам нужен поток быть на переднем плане, (3) вы нужно манипулировать нитью приоритет или (4) вам нужен поток иметь фиксированную идентификацию (прерывание, приостановление, обнаружение).

4. Класс темы

  • Используйте класс Thread для длительных задач и когда вы требуют функций, предлагаемых формальным моделирование резьбы, например, выбор между передним и задним потоков, настройка приоритета потока, мелкозернистый контроль над резьбой исполнение и т.д.

Ответ 2

Я не понимаю в .net, почему у нас есть асинхронный вызов (delegate.BeginInvoke() и delegate.EndInvoke()), а также класс Thread?

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

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

  • Потоки предназначены для того, чтобы делать вещи, которые никогда не заканчиваются.

Примеры:

Если вы читаете большой файл с диска и не хотите блокировать поток графического интерфейса, используйте асинхронный вызов.

Если вы лениво написали один или несколько файлов в фоновом режиме, используйте пул потоков.

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

Ответ 3

Асинхронный метод существенно абстрагирует способ обработки работы. Он может быть выведен в новый процесс, он может выполняться в отдельном потоке... Это не имеет значения.

Все, что имеет значение, это вы говорите:

  • Запустите этот код при запуске.
  • И запустите этот код, когда закончите.

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

Ответ 4

Я не понимаю в .net, почему мы Асинхронный вызов (delegate.BeginInvoke() & delegate.EndInvoke()), а также Класс темы?

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

Класс Thread использует Win32 BeginThread, поэтому вам не нужно. Пул потоков использует класс Thread, поэтому вам не нужно. BeginInvoke использует пул потоков, поэтому вам не нужно и т.д.

Ответ 5

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

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

Асинхронные делегаты используются, если вы хотите быстро выполнить метод асинхронно.

Кроме того, EndInvoke позволяет вернуть объект, который позволяет вам получить результаты выполнения. A Thread.Join, хотя функционально эквивалентен, не позволяет вам ничего возвращать.

Ответ 6

Это давно забытый поток, но что-то, о чем здесь не упоминалось, было то, что существует два типа работы: вычисление и привязка ввода-вывода.

В случае работы с вычислением вычислений это выполняется в отдельном потоке (если вы используете шаблон BackgroundWorker или Begin/End), это происходит из пула потоков или пользовательский поток, если вы решили создать свой собственный нить).

С другой стороны, привязка ввода/вывода выполняется в портах ввода/вывода (аппаратная поддержка) и не требует потока; Доступ к файлам и сетевые сокеты - два примера задач, связанных с I/O.

Ответ 7

Если у вас длительный процесс (например, приложение формы, IIS, веб-сервис, служба Windows), вам, скорее всего, будет лучше использовать методы Async. Для потоков требуются системные ресурсы и накладные расходы. Я всегда стараюсь избегать создания потоков. Если я не могу, я стараюсь полагаться на ThreadPool для их обработки и управления ими.

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

BeginInvoke использует делегат за кулисами, где, как правило, методы Async этого не делают.

Ответ 8

Delegate.BeginInvoke захватывает поток threadpool и выполняет переданный делегат в этом потоке. Поэтому, когда вы используете BeginInvoke,.NET Framework выполняет большую работу, например, создает новый поток, запускает его и т.д.

Вы также можете взглянуть на ThreadPool.QueueUserWorkItem(delegate {/* do stuff */}); для альтернативного подхода к асинхронным вызовам.