Я понимаю многопоточность в теории, но не на практике в .net

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
1 220
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

  • ФонРабочий элемент управления
  • WaitHandles
  • Функции обратного вызова
  • опрос объекта ASyncResult

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

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

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

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

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

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

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

What Every Dev Must Know About Multithreaded Apps
Understand the Impact of Low-Lock Techniques in Multithreaded Apps

Хотя эта статья - не совсем то, что вам нужно, но, надеюсь, она будет полезной в целом (т.е. она связана с является, и ее можно очень хорошо прочитать):

The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software

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

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

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

Другие вопросы по теме