Ответ 1
Вопрос ответиен, но ответы немного подробны (IMO).
Возьмем каждый по очереди.
System.Threading.Thread
Все потоки (в CLR в любом случае) в конечном итоге представлены этим классом. Однако вы, вероятно, включили это в запрос, когда нам захочется создать экземпляр самостоятельно.
Ответ редко. Обычно повседневная рабочая лошадка для отправки фоновых задач - это Threadpool
. Однако есть некоторые обстоятельства, когда мы хотим создать собственный поток. Обычно такой поток будет использоваться для большей части времени выполнения приложения. Он потратил большую часть своей жизни на блокировку на ручке ожидания. Иногда мы сигнализируем об этом ручке, и он оживает, чтобы сделать что-то важное, но затем он возвращается спать. Мы не используем рабочий элемент Threadpool для этого, потому что мы не считаем идею о том, что он может стоять в очереди за большим множеством выдающихся задач, некоторые из которых сами могут (возможно, небрежно) блокироваться на каком-то другом ожидании.
System.ComponentModel.BackgroundWorker
Это дружественная оболочка класса вокруг рабочего элемента ThreadPool. Этот класс относится только к разработчику, ориентированному на пользовательский интерфейс, которому иногда приходится использовать фоновый поток. Его события, отправляемые по потоку пользовательского интерфейса, позволяют легко потреблять.
System.Threading.ThreadPool.QueueUserWorkItem
Это повседневная рабочая лошадка, когда у вас есть работа, которую вы хотите делать в фоновом потоке. Это устраняет затраты на выделение и освобождение отдельных потоков для выполнения какой-либо задачи. Он ограничивает количество экземпляров потоков, чтобы предотвратить слишком много ресурсов, которые были поглощены слишком большим количеством операций, и попытаться запустить их параллельно.
QueueUserWorkItem
- мой предпочтительный вариант для вызова фоновых операций.