ParameterizedThreadStart Делегат
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет метод, который выполняется в объекте Thread.
public delegate void ParameterizedThreadStart(System::Object ^ obj);
public delegate void ParameterizedThreadStart(object? obj);
[System.Runtime.InteropServices.ComVisible(false)]
public delegate void ParameterizedThreadStart(object obj);
public delegate void ParameterizedThreadStart(object obj);
type ParameterizedThreadStart = delegate of obj -> unit
[<System.Runtime.InteropServices.ComVisible(false)>]
type ParameterizedThreadStart = delegate of obj -> unit
Public Delegate Sub ParameterizedThreadStart(obj As Object)
Параметры
- obj
- Object
Объект, содержащий данные для процедуры потока.
- Атрибуты
Примеры
В следующем примере кода делегат используется ParameterizedThreadStart для выполнения статического метода и метода экземпляра. Первый ParameterizedThreadStart делегат представлен статическим DoWork методом, а второй представлен методом экземпляра DoMoreWork . Оба метода соответствуют ParameterizedThreadStart сигнатуре делегата, то есть имеют один параметр типа Object и не возвращают значение.
Note
Компиляторы Visual Basic и C# выводят делегат ParameterizedThreadStart из подписей методов DoWork и DoMoreWork и вызывают правильный конструктор. Таким образом, в коде нет явного вызова конструктора.
using System;
using System.Threading;
public class Work
{
public static void Main()
{
// Start a thread that calls a parameterized static method.
Thread newThread = new Thread(Work.DoWork);
newThread.Start(42);
// Start a thread that calls a parameterized instance method.
Work w = new Work();
newThread = new Thread(w.DoMoreWork);
newThread.Start("The answer.");
}
public static void DoWork(object data)
{
Console.WriteLine("Static thread procedure. Data='{0}'",
data);
}
public void DoMoreWork(object data)
{
Console.WriteLine("Instance thread procedure. Data='{0}'",
data);
}
}
// This example displays output like the following:
// Static thread procedure. Data='42'
// Instance thread procedure. Data='The answer.'
Imports System.Threading
Public Class Work
Shared Sub Main()
' Start a thread that calls a parameterized static method.
Dim newThread As New Thread(AddressOf Work.DoWork)
newThread.Start(42)
' Start a thread that calls a parameterized instance method.
Dim w As New Work()
newThread = New Thread(AddressOf w.DoMoreWork)
newThread.Start("The answer.")
End Sub
Public Shared Sub DoWork(ByVal data As Object)
Console.WriteLine("Static thread procedure. Data='{0}'",
data)
End Sub
Public Sub DoMoreWork(ByVal data As Object)
Console.WriteLine("Instance thread procedure. Data='{0}'",
data)
End Sub
End Class
' This example displays output like the following:
' Static thread procedure. Data='42'
' Instance thread procedure. Data='The answer.'
Комментарии
При создании управляемого потока метод, который выполняется в потоке, представлен следующим образом:
Делегат ThreadStart , передаваемый конструктору Thread.Thread(ThreadStart) . Любой метод, не имеющий параметров и возвращающий
voidв C# или является процедуройSubв Visual Basic может представлять делегат.Делегат ParameterizedThreadStart , передаваемый конструктору Thread.Thread(ParameterizedThreadStart) . Любой метод, имеющий один параметр типа Object, который возвращает void в C# или является процедурой Sub в Visual Basic может представлять делегат.
Поток не начинает выполняться до Thread.Start вызова метода. Вызов ThreadStart или ParameterizedThreadStart делегат в потоке начинается с первой строки метода, представленного делегатом. В случае делегата ParameterizedThreadStart объект, передаваемый методу, передается Start(Object) делегату.
Note
пользователи Visual Basic и C# могут пропускать конструктор делегата ThreadStart или ParameterizedThreadStart делегата при создании потока. В Visual Basic используйте оператор AddressOf при передаче метода в конструктор Thread, например Dim t As New Thread(AddressOf ThreadProc). В C#просто укажите имя процедуры потока. Компилятор выбирает правильный конструктор делегата.
Note
При создании ParameterizedThreadStart делегата для метода экземпляра в C++первый параметр конструктора является переменной экземпляра. Для статического метода первый параметр конструктора равен нулю. Для статического метода конструктор делегата требует только один параметр: адрес метода обратного вызова, квалифицированный именем класса.
Делегат ParameterizedThreadStart и перегрузка Thread.Start(Object) метода упрощают передачу данных в процедуру потока, но этот метод не является безопасным, так как любой объект можно передать Thread.Start(Object)в . Более надежный способ передачи данных в процедуру потока заключается в том, чтобы поместить процедуру потока и поля данных в рабочий объект. Дополнительные сведения см. в разделе "Создание потоков и передача данных во время начала".
Делегат ParameterizedThreadStart поддерживает только один параметр. Вы можете передать несколько элементов данных в ParameterizedThreadStart этот параметр, сделав этот параметр одним из следующих:
- Массив.
- Тип коллекции, если все элементы данных имеют одинаковый тип.
- Тип кортежа, например Tuple<T1,T2> или Tuple<T1,T2,T3,T4>.
Методы расширения
| Имя | Описание |
|---|---|
| GetMethodInfo(Delegate) |
Возвращает объект, представляющий метод, представленный указанным делегатом. |