Я понимаю, что потоки в теории, но не на практике в .net - PullRequest
7 голосов
/ 08 сентября 2008

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

Ответы [ 5 ]

23 голосов
/ 08 сентября 2008

Это отличный бесплатный ресурс Джозефа Албахари. Threading в C #

11 голосов
/ 08 сентября 2008

Две замечательные статьи:

Что каждый разработчик должен знать о многопоточных приложениях
Понимание влияния методов низкого блокирования в многопоточных приложениях

Хотя эта статья не совсем то, что вы ищете, она, как мы надеемся, будет полезна в целом (то есть, она имеет отношение , и очень хорошее чтение):

Бесплатный обед окончен: фундаментальный поворот в сторону параллелизма в программном обеспечении

5 голосов
/ 08 сентября 2008

Существует 4 основных способа синхронизации потоков в .Net:

  • Управление BackgroundWorker
  • WaitHandles
  • Функции обратного вызова
  • опрос объекта ASyncResult

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

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

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

Наконец, если и только если по какой-либо причине ничего из вышеперечисленного не сработает, вы можете вернуться к опросу.

Я могу придумать 5 разных способов получить новый поток в .Net, также примерно в порядке:

  • ОС создана, как правило, в результате события winforms (включая BackgoundWorker).
  • Obj.Begin ___ () / Конец ____ (). Некоторые классы CLR уже имеют эти асинхронные методы, определенные для вас, и, очевидно, вы хотите использовать их, когда они доступны.
  • ThreadPool.QueueUserWorkItem (). Используйте это большую часть времени, чтобы создавать свои собственные темы.
  • Delegate.BeginInvoke () / EndInvoke (). Таким способом вы можете обернуть любой метод.
  • Thread.start (). Вы могли бы сделать это таким образом, но я недавно что-то прочитал (сейчас у меня нет ссылки), что если QueueUserWorkItem не будет работать, метод делегата, вероятно, лучше.
2 голосов
/ 08 сентября 2008

Хороший веб-ресурс для изучения многопоточности в .NET:

1 голос
/ 18 сентября 2008

Один из лучших источников, которые я знаю по этой теме, - книга "Threading in C #": http://www.albahari.com/threading/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...