Асинхронные делегаты по сравнению с потоком/Пулом потоков?

Лучший путь состоял бы в том, чтобы использовать isinstance и преобразование типов. Если я понимаю Вас правильный, Вы хотите это:

def __init__ (self, filename):
    if isinstance (filename, basestring):
        # filename is a string
    else:
        # try to convert to a list
        self.path = list (filename)
33
задан claws 3 December 2009 в 06:03
поделиться

7 ответов

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

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

BackgroundWorker vs background Thread

2. BackgroundWorker

  • Use BackgroundWorker if you have a single task that run in the и должен взаимодействовать с UI. и использовать его, если вас не волнует, когда они завершат свою задачу. Задача сортировки данных и вызовы методов к потоку пользовательского интерфейса автоматически обрабатывается через его событийная модель.
  • Избегайте BackgroundWorker , если (1) Ваша сборка еще не ссылка на System.Windows.Form сборка, (2) резьба нужна, чтобы быть нитью на переднем плане, или (3) вы необходимость манипулировать резьбой приоритет.

3. ThreadPool

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

4. Thread class

  • Use the Thread class for longrunning tasks and when you требуют особенностей, предлагаемых формальным резьбовая модель, например, выбор между передним и задним планом нити, настройка приоритета нити, мелкозернистый контроль над резьбой выполнение и т.д.
44
ответ дан 27 November 2019 в 18:06
поделиться

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

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

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

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

Примеры:

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

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

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

12
ответ дан 27 November 2019 в 18:06
поделиться

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

Важно только то, что вы говорите:

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

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

5
ответ дан 27 November 2019 в 18:06
поделиться

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

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

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

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

1
ответ дан 27 November 2019 в 18:06
поделиться

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

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

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

0
ответ дан 27 November 2019 в 18:06
поделиться

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

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

0
ответ дан 27 November 2019 в 18:06
поделиться

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

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

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

3
ответ дан 27 November 2019 в 18:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: