2010-10-26 3 views
1

Я пишу dll, который должен запускать функцию несколько раз, используя разные параметры, параллельно ко всему остальному..net multi-threading

Я попытался следующие методы:

  • Backgroundworkers
  • MethodInvoker
  • Темы
  • и т.д.

Какой самый лучший способ сделать это?

Update:

Я пишу DLL, как графический интерфейс участвует

+0

много ссылок здесь: [Многопоточность ссылки?] (Http://stackoverflow.com/questions/601558/multithreading-reference/602001#602001) – lsalamon

ответ

2

Если вы используете .NET 4.0, вы должны использовать новый Parallel Task Library.

Если нет, попробуйте использовать threadpool для выполнения вашей работы с помощью ThreadPool.QueueUserWorkItem(). В противном случае создание нового объекта Thread - это путь. Do не использование BackgroundWorker для этого; только если вы пытались отделить длинный процессорный код от блокировки пользовательского интерфейса, вы бы использовали BackgroundWorker.

Существует довольно хороший пример ожидания всех рабочих элементов для пользователей здесь: http://msdn.microsoft.com/en-us/library/z6w25xa6.aspx. По сути, вы передаете объект ManualResetEvent в каждый вызов, который является Set(), когда асинхронный код завершается. Вы помещаете все объекты ManualResetEvent в массив и вызываете WaitHandle.WaitAll(), проходящие в этом массиве, чтобы ждать установки всех waithandles.

Другим методом может быть контролируемое количество запущенных объектов Thread, которые ожидают появления элементов в Queue. Это довольно стандартный шаблон Producer/Consumer, который означает, что вам нужно меньше потоков (и, следовательно, ресурсов), но все равно может отделить запрос от работы, помещая сообщения в очередь. Если вам нужна длительная очередь, вы можете использовать MSMQ (и вы можете пойти еще дальше, чем с ESB).

Как вы можете видеть, где вы рассматриваете многопоточность делает огромную разницу на как вы его реализации. Многопоточность Windows Form не будет такой же, как многопоточность Windows-службы, и, в свою очередь, она не будет такой же, как в веб-приложении ASP.NET (где, возможно, потоковая передача не является даже хорошей идеей из-за управления ресурсами в IIS). Если вы обновите свой вопрос, мы сможем уточнить ваши текущие потребности.

+0

с удовольствием, но, его 3.5 :( – eba

+0

ТНХ, плохо попробовать бассейн – eba

+0

ok, если я использовал пул, теперь мне нужно подождать, пока все мои потоки не закончатся, как это можно сделать? – eba

0

Мои предложения:

  • Если вы начинаете фоновый поток из WinForms UI, использовать компонент BackgroundWorker.
  • Если вам неинтересно, когда задание запускается или заканчивается до тех пор, пока оно выполняется, используйте асинхронный делегат или пул потоков.
  • В противном случае создайте новый поток вручную.
1

Threading сложно, что является «лучшим», зависит от конкретного сценария. Например, на веб-сервере «лучше всего» может быть не использовать threading вообще, и пусть другие потоки обрабатывают другие запросы. Единственное, чего вам следует избегать, это насыщение ThreadPool, так как другие основные части системы зависят от этого.

Это звуки, как рабочая очередь с несколькими читателями, будут служить вашим целям; обратите внимание также, что .NET 4.0 вводит ряд контролей (вокруг «Параллельные» и «Задачи»), которые упрощают обработку кода с резьбой. A разумный общий обзор here.