Если вы используете .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). Если вы обновите свой вопрос, мы сможем уточнить ваши текущие потребности.
много ссылок здесь: [Многопоточность ссылки?] (Http://stackoverflow.com/questions/601558/multithreading-reference/602001#602001) – lsalamon