Темы и делегаты - я не совсем понимаю их отношения
==================================================

Я написал код, который выглядит примерно так:

И это работает (иногда кажется, что есть несколько потоков).

Пока я не использую никаких делегатов.

В чем смысл протектора без делегата?Если делегат нужен - тогда, пожалуйста, скажите мне, что и как делается с делегатом.

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

Делегат - это .NET-версия указателя безопасной функции типа. Все потоки требуют точки входа, чтобы начать выполнение. По определению, когда создается первичный поток, он всегда запускает Main () в качестве своей точки входа. Любые дополнительные потоки, которые вы создадите, будут нуждаться в явно определенной точке входа - указателе на функцию, с которой они должны начать выполнение. Таким образом, потоки всегда требуют делегата.

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

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

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

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

Реальный код будет более сложным, и реальный класс никогда не должен будет знать, как создавать потоки и т. Д., Чтобы у вас были объекты менеджера.



Выявляются использование делегата - это просто синтаксический сахар C # для:

Компиляторвыводя от лямбда-выражения и различных перегрузок, которые`Thread` у конструктора есть намерение:

Создать экземпляр`ThreadStart` делегировать.Передайте его в качестве аргумента перегрузке конструктора`Thread` который принимает`ThreadStart` объект.Вы также можете эквивалентно написать это с синтаксисом анонимного делегата:

Если аргументы`createSomething` не являются (захваченными) местными жителями, вы могли бы написать это вообще без анонимных методов, что должно более четко выделить создание делегата: