Бөлісу құралы:


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 и не возвращают значение.

Примечание

Компиляторы Visual Basic и C# выводят ParameterizedThreadStart делегат из сигнатур DoWork и DoMoreWork методов и вызывают правильный конструктор. Таким образом, в коде нет явного вызова конструктора.

using namespace System;
using namespace System::Threading;

namespace SystemThreadingExample
{
    public ref class Work
    {
    public:
        void StartThreads()
        {
            // Start a thread that calls a parameterized static method.
            Thread^ newThread = gcnew
                Thread(gcnew ParameterizedThreadStart(Work::DoWork));
            newThread->Start(42);
              
            // Start a thread that calls a parameterized instance method.
            Work^ someWork = gcnew Work;
            newThread = gcnew Thread(
                        gcnew ParameterizedThreadStart(someWork,
                        &Work::DoMoreWork));
            newThread->Start("The answer.");
        }

        static void DoWork(Object^ data)
        {
            Console::WriteLine("Static thread procedure. Data='{0}'", 
                data);
        }

        void DoMoreWork(Object^ data)
        {
            Console::WriteLine("Instance thread procedure. Data='{0}'", 
                data);
        }
    };
}

//Entry point of example application
int main()
{
    SystemThreadingExample::Work^ samplework = 
        gcnew SystemThreadingExample::Work();
    samplework->StartThreads();
}
// This example displays output like the following:
//       Static thread procedure. Data='42'
//       Instance thread procedure. Data='The answer.'
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 вызова метода. ParameterizedThreadStart Или ThreadStart делегат вызывается в потоке, и выполнение начинается в первой строке метода, представленного делегатом. В случае делегата ParameterizedThreadStart объект, передаваемый методу, передается Start(Object) делегату.

Примечание

Visual Basic и пользователи C# могут опустить ThreadStart конструктор или ParameterizedThreadStart делегат при создании потока. В Visual Basic используйте AddressOf оператор при передаче метода конструкторуThread, напримерDim t As New Thread(AddressOf ThreadProc). В C# просто укажите имя процедуры потока. Компилятор выбирает правильный конструктор делегата.

Примечание

При создании делегата ParameterizedThreadStart для метода экземпляра в C++первый параметр конструктора является переменной экземпляра. Для статического метода первый параметр конструктора равен нулю. Для статического метода конструктор делегата требует только один параметр: адрес метода обратного вызова, квалифицированный по имени класса.

Делегат ParameterizedThreadStart и перегрузка Thread.Start(Object) метода упрощают передачу данных в процедуру потока, но этот метод не является типобезопасной, поскольку любой объект может быть передан Thread.Start(Object)в . Более надежный способ передачи данных в процедуру потока — поместить как процедуру потока, так и поля данных в рабочий объект. Дополнительные сведения см. в статье "Создание потоков и передача данных во время начала".

Делегат ParameterizedThreadStart поддерживает только один параметр. Вы можете передать несколько элементов данных, ParameterizedThreadStart сделав этот параметр одним из следующих:

  • Массив объектов .

  • Тип коллекции, если все элементы данных имеют одинаковый тип.

  • Тип кортежа, например Tuple<T1,T2> .Tuple<T1,T2,T3,T4>

Методы расширения

GetMethodInfo(Delegate)

Получает объект, представляющий метод, представленный указанным делегатом.

Применяется к

См. также раздел