ParameterizedThreadStart Delegat

Definicja

Reprezentuje metodę wykonywaną w obiekcie 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)

Parametry

obj
Object

Obiekt, który zawiera dane dla procedury wątku.

Atrybuty

Przykłady

Poniższy przykład kodu używa delegata ParameterizedThreadStart do wykonywania metody statycznej i metody wystąpienia. Pierwszy ParameterizedThreadStart delegat jest reprezentowany przez metodę statyczną DoWork , a drugi jest reprezentowany przez metodę wystąpienia DoMoreWork . Obie metody pasują do podpisu delegata ParameterizedThreadStart , czyli mają jeden parametr typu Object i nie zwracają wartości.

Uwaga

Kompilatory Visual Basic i C# wywnioskują ParameterizedThreadStart delegata z podpisów DoWork metod i DoMoreWork i i wywołają prawidłowy konstruktor. W związku z tym w kodzie nie ma jawnego wywołania konstruktora.

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.'

Uwagi

Po utworzeniu zarządzanego wątku metoda wykonywana w wątku jest reprezentowana przez:

Wątek nie rozpoczyna wykonywania, dopóki Thread.Start metoda nie zostanie wywołana. Delegat ThreadStart lub ParameterizedThreadStart jest wywoływany w wątku, a wykonanie rozpoczyna się od pierwszego wiersza metody reprezentowanej przez delegata. W przypadku delegata ParameterizedThreadStart obiekt przekazany do Start(Object) metody jest przekazywany do delegata.

Uwaga

Visual Basic i użytkownicy języka C# mogą pominąć ThreadStart konstruktora lub ParameterizedThreadStart delegata podczas tworzenia wątku. W Visual Basic użyj AddressOf operatora podczas przekazywania metody do konstruktoraThread, Dim t As New Thread(AddressOf ThreadProc)na przykład . W języku C# po prostu określ nazwę procedury wątku. Kompilator wybiera prawidłowy konstruktor delegata.

Uwaga

Podczas tworzenia delegata ParameterizedThreadStart dla metody wystąpienia w języku C++, pierwszym parametrem konstruktora jest zmienna wystąpienia. W przypadku metody statycznej pierwszy parametr konstruktora ma wartość zero. W przypadku metody statycznej konstruktor delegata wymaga tylko jednego parametru: adresu metody wywołania zwrotnego kwalifikowanego przez nazwę klasy.

Delegat ParameterizedThreadStart i Thread.Start(Object) przeciążenie metody ułatwiają przekazywanie danych do procedury wątku, ale ta technika nie jest bezpieczna, ponieważ do dowolnego obiektu można przekazać Thread.Start(Object)obiekt . Bardziej niezawodnym sposobem przekazywania danych do procedury wątku jest umieszczenie zarówno procedury wątku, jak i pól danych w obiekcie procesu roboczego. Aby uzyskać więcej informacji, zobacz Tworzenie wątków i przekazywanie danych w czasie rozpoczęcia.

Delegat ParameterizedThreadStart obsługuje tylko jeden parametr. Możesz przekazać wiele elementów danych do elementu ParameterizedThreadStart , tworząc jeden z następujących parametrów:

Metody rozszerzania

GetMethodInfo(Delegate)

Pobiera obiekt reprezentujący metodę reprezentowaną przez określonego delegata.

Dotyczy

Zobacz też