- Thread Start Делегат
- Определение
- Примеры
- Комментарии
- Методы расширения
- Thread. Start Метод
- Определение
- Перегрузки
- Start()
- Исключения
- Примеры
- Комментарии
- Применяется к
- Start(Object)
- Параметры
- Исключения
- Примеры
- Комментарии
- Thread. Start Method
- Definition
- Overloads
- Start()
- Exceptions
- Examples
- Remarks
- Applies to
- Start(Object)
- Parameters
- Exceptions
- Examples
- Remarks
- Потоки в C# .NET первые шаги
Thread Start Делегат
Определение
Представляет метод, который выполняется в отношении Thread. Represents the method that executes on a Thread.
Примеры
В следующем примере кода показан синтаксис для создания и использования ThreadStart делегата с методом экземпляра и со статическим методом. The following code example shows the syntax for creating and using a ThreadStart delegate with an instance method and with a static method.
Еще один простой пример, демонстрирующий создание ThreadStart делегата, см. в разделе Thread.Start() перегрузка метода. For another simple example that demonstrates how to create a ThreadStart delegate, see the Thread.Start() method overload. Дополнительные сведения о создании потоков см. в разделе Создание потоков и передача данных во время начала. For more information about thread creation, see Creating Threads and Passing Data at Start Time.
Комментарии
При создании управляемого потока метод, выполняемый в потоке, представляется ThreadStart делегатом или ParameterizedThreadStart делегатом, который передается в Thread конструктор. When a managed thread is created, the method that executes on the thread is represented by a ThreadStart delegate or a ParameterizedThreadStart delegate that is passed to the Thread constructor. Поток не начинает выполняться до Thread.Start вызова метода. The thread does not begin executing until the Thread.Start method is called. Выполнение начинается с первой строки метода, представленного ThreadStart ParameterizedThreadStart делегатом или. Execution begins at the first line of the method represented by the ThreadStart or ParameterizedThreadStart delegate.
При создании потока пользователи Visual Basic и C# могут опустить ThreadStart ParameterizedThreadStart конструктор делегата или. Visual Basic and C# users can omit the ThreadStart or ParameterizedThreadStart delegate constructor when creating a thread. В Visual Basic используйте AddressOf оператор при передаче метода в Thread конструктор, например Dim t As New Thread(AddressOf ThreadProc) . In Visual Basic, use the AddressOf operator when passing your method to the Thread constructor; for example, Dim t As New Thread(AddressOf ThreadProc) . В C# просто укажите имя процедуры потока. In C#, simply specify the name of the thread procedure. Компилятор выбирает правильный конструктор делегата. The compiler selects the correct delegate constructor.
Для C++, начиная с .NET Framework 2,0, создание ThreadStart делегата для статического метода требует только одного параметра: адрес метода обратного вызова, дополненного именем класса. For C++, starting with .NET Framework 2.0, creating a ThreadStart delegate for a static method requires only one parameter: the address of the callback method, qualified by the class name. В более ранних версиях при создании делегата для статического метода требовалось два параметра: ноль (null) и адрес метода. In earlier versions two parameters were required when creating a delegate for a static method: zero (null) and the method address. Для метода экземпляра все версии должны иметь два параметра: переменная экземпляра и адрес метода. For an instance method, all versions require two parameters: the instance variable and the method address.
Методы расширения
Получает объект, представляющий метод, представленный указанным делегатом. Gets an object that represents the method represented by the specified delegate.
Thread. Start Метод
Определение
Позволяет планировать выполнение потока. Causes a thread to be scheduled for execution.
Перегрузки
Вынуждает операционную систему изменить состояние текущего экземпляра на Running. Causes the operating system to change the state of the current instance to Running.
Заставляет операционную систему изменить состояние текущего экземпляра на Running, а также (необязательно) передает объект с данными, используемыми методом в потоке. Causes the operating system to change the state of the current instance to Running, and optionally supplies an object containing data to be used by the method the thread executes.
Start()
Вынуждает операционную систему изменить состояние текущего экземпляра на Running. Causes the operating system to change the state of the current instance to Running.
Исключения
Поток уже запущен. The thread has already been started.
Недостаточно памяти для запуска этого потока. There is not enough memory available to start this thread.
Примеры
В следующем примере создается и запускается поток. The following example creates and starts a thread.
Комментарии
Как только поток находится в ThreadState.Running состоянии, операционная система может запланировать его выполнение. Once a thread is in the ThreadState.Running state, the operating system can schedule it for execution. Поток начинает выполняться в первой строке метода, представленного ThreadStart ParameterizedThreadStart делегатом или, предоставленным конструктору потока. The thread begins executing at the first line of the method represented by the ThreadStart or ParameterizedThreadStart delegate supplied to the thread constructor. Обратите внимание, что вызов метода не Start блокирует вызывающий поток. Note that the call to Start does not block the calling thread.
Если эта перегрузка используется с потоком, созданным с помощью ParameterizedThreadStart делегата, null передается методу, выполняемому потоком. If this overload is used with a thread created using a ParameterizedThreadStart delegate, null is passed to the method executed by the thread.
После завершения потока он не может быть перезапущен с другим вызовом Start . Once the thread terminates, it cannot be restarted with another call to Start .
Применяется к
Start(Object)
Заставляет операционную систему изменить состояние текущего экземпляра на Running, а также (необязательно) передает объект с данными, используемыми методом в потоке. Causes the operating system to change the state of the current instance to Running, and optionally supplies an object containing data to be used by the method the thread executes.
Параметры
Объект, содержащий данные, используемые методом, который выполняется потоком. An object that contains data to be used by the method the thread executes.
Исключения
Поток уже запущен. The thread has already been started.
Недостаточно памяти для запуска этого потока. There is not enough memory available to start this thread.
Этот поток был создан с помощью делегата ThreadStart, а не делегата ParameterizedThreadStart. This thread was created using a ThreadStart delegate instead of a ParameterizedThreadStart delegate.
Примеры
В следующем примере создается ParameterizedThreadStart делегат с статическим методом и методом экземпляра. The following example creates a ParameterizedThreadStart delegate with a static method and an instance method.
Комментарии
Как только поток находится в ThreadState.Running состоянии, операционная система может запланировать его выполнение. Once a thread is in the ThreadState.Running state, the operating system can schedule it for execution. Поток начинает выполняться в первой строке метода, представленного ThreadStart ParameterizedThreadStart делегатом или, предоставленным конструктору потока. The thread begins executing at the first line of the method represented by the ThreadStart or ParameterizedThreadStart delegate supplied to the thread constructor. Обратите внимание, что вызов метода не Start блокирует вызывающий поток. Note that the call to Start does not block the calling thread.
После завершения потока он не может быть перезапущен с другим вызовом Start . Once the thread terminates, it cannot be restarted with another call to Start .
Эта перегрузка и ParameterizedThreadStart делегат упрощают передачу данных в потоковую процедуру, но этот метод не является типобезопасным, так как любой объект может быть передан в эту перегрузку. This overload and the ParameterizedThreadStart delegate make it easy to pass data to a thread procedure, but the technique is not type safe because any object can be passed to this overload. Более надежный способ передачи данных в потоковую процедуру заключается в помещении как процедуры потока, так и полей данных в рабочий объект. A more robust way to pass data to a thread procedure is to put both the thread procedure and the data fields into a worker object. Дополнительные сведения см. в разделе Создание потоков и передача данных во время начала. For more information, see Creating Threads and Passing Data at Start Time.
Thread. Start Method
Definition
Causes a thread to be scheduled for execution.
Overloads
Causes the operating system to change the state of the current instance to Running.
Causes the operating system to change the state of the current instance to Running, and optionally supplies an object containing data to be used by the method the thread executes.
Start()
Causes the operating system to change the state of the current instance to Running.
Exceptions
The thread has already been started.
There is not enough memory available to start this thread.
Examples
The following example creates and starts a thread.
Remarks
Once a thread is in the ThreadState.Running state, the operating system can schedule it for execution. The thread begins executing at the first line of the method represented by the ThreadStart or ParameterizedThreadStart delegate supplied to the thread constructor. Note that the call to Start does not block the calling thread.
If this overload is used with a thread created using a ParameterizedThreadStart delegate, null is passed to the method executed by the thread.
Once the thread terminates, it cannot be restarted with another call to Start .
Applies to
Start(Object)
Causes the operating system to change the state of the current instance to Running, and optionally supplies an object containing data to be used by the method the thread executes.
Parameters
An object that contains data to be used by the method the thread executes.
Exceptions
The thread has already been started.
There is not enough memory available to start this thread.
This thread was created using a ThreadStart delegate instead of a ParameterizedThreadStart delegate.
Examples
The following example creates a ParameterizedThreadStart delegate with a static method and an instance method.
Remarks
Once a thread is in the ThreadState.Running state, the operating system can schedule it for execution. The thread begins executing at the first line of the method represented by the ThreadStart or ParameterizedThreadStart delegate supplied to the thread constructor. Note that the call to Start does not block the calling thread.
Once the thread terminates, it cannot be restarted with another call to Start .
This overload and the ParameterizedThreadStart delegate make it easy to pass data to a thread procedure, but the technique is not type safe because any object can be passed to this overload. A more robust way to pass data to a thread procedure is to put both the thread procedure and the data fields into a worker object. For more information, see Creating Threads and Passing Data at Start Time.
Потоки в C# .NET первые шаги
Уважаемые читатели, в этой статье я хочу рассказать о таком важном средстве многозадачного программирования среды .NET, как многопоточность. Данная статья содержит начальные сведения, и предназначена для быстрого освоения азов многопоточности на языке C#. Однако не буду разглагольствовать о преимуществах параллельного выполнения задач, и перейду к примеру кода.
На что стоит обратить внимание в этой программе. В первую очередь это пространство имен System.Threading. Это пространство имен содержит в себе классы поддерживающие многопоточное программирование. И именно там содержится класс Thread, который мы используем далее в коде.
Далее мы создаем объект потока.
Конструктору этого класса необходимо передать имя функции возвращающей void, которая собственно и будет вызываться в параллельном потоке. После чего мы запускаем наш поток методом Start() определенном внутри вновь созданного потока.
Итак, главный и второстепенный поток параллельно выполняют почти идентичный код они считают до 9 (как повелось, с нуля), перед этим назвав собственный номер. Обратите внимание на статический метод Thread.Sleep(0). Он приостанавливает поток вызвавший его на количество миллисекунд указанных в параметре. Но в данном случае ему передан параметр 0. Это означает что поток должен приостановиться для того чтобы дать возможность выполнения другому потоку.
И для того чтобы консоль не закрылась раньше времени, мы будем ожидать ввода с клавиатуры (Console.Read).В результате ваша программа выведет в консоль примерно следующее:
Поток 1 выводит 0
Поток 2 выводит 0
Поток 1 выводит 1
Поток 1 выводит 2
Поток 1 выводит 3
Поток 2 выводит 1
и т.д.
Хотя результат вывода каждый раз будет разным. Это зависит от множества факторов.Стоит принять во внимание, что потоки бывают двух видов: приоритетные и фоновые. Фоновые потоки автоматически завершаются при завершении приоритетных. По умолчанию в приоритетном потоке запускается функция Main а остальные потоки создаются фоновыми. Именно поэтому мы должны следить за тем, чтобы главный поток не завершился до окончания производных. Для того чтобы не допустить этого мы можем использовать поле IsAlive, которое возвращает true если поток активен. Либо метод Join(), который заставляет поток в котором он вызван ожидать завершения работы потока которому он принадлежит.
Однако мы можем и сами менять виды потоков. Свойство потока IsBackground определяет является ли поток фоновым. Таким образом, мы можем сделать поток приоритетным. myThread.IsBackground = false; Однако, нам необязательно создавать новый поток внутри метода Main. Давайте создадим класс который будет открывать новый поток в собственном конструкторе. Созданный нами класс по-прежнему будет заниматься счетом, но на этот раз он будет считать до указанного числа, за счет передачи потоку параметров.
Разберем данный пример. Конструктор нашего класса myThread принимает 2 параметра: строку, в которой мы определяем имя потока, и номер до которого будет вестись счет в цикле. В конструкторе мы создаем поток, связанный с функцией func данного объекта. Далее мы присваиваем нашему потоку имя, используя поле Name созданного потока. И запускаем наш поток, передав функции Start аргумент.
Обратите внимание на то, что функция вызываемая потоком может принимать только 1 аргумент, и только типа object. В функции func цикл for досчитывает до числа, переданного ему как аргумент, и поток завершается. В функции Main мы создаем 3 пробных объекта, работа которых выведет на консоль примерно следующий текст.
Thread 1 выводит 0
Thread 1 выводит 1
Thread 2 выводит 0
Thread 2 выводит 1
Thread 2 выводит 2
Thread 2 завершился
На этом примере я хочу закончить свою статью. И хотя много средств работы с потоками остались незатронутыми мной, я смею надеяться что информация представленная мной будет полезной.