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 メソッドで表され、2 番目のデリゲートはインスタンス DoMoreWork メソッドによって表されます。 どちらのメソッドもデリゲート シグネチャと ParameterizedThreadStart 一致します。つまり、型 Object のパラメーターが 1 つあり、値を返しません。

Note

Visual Basic コンパイラと C# コンパイラは、 メソッドと DoMoreWork メソッドのシグネチャからデリゲートをDoWork推論ParameterizedThreadStartし、正しいコンストラクターを呼び出します。 したがって、コード内に明示的なコンストラクター呼び出しはありません。

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)デリゲート。 パラメーターがなく、C# で を返す void メソッド、または Visual Basic のプロシージャであるメソッドは Sub 、デリゲートを表すことができます。

  • ParameterizedThreadStartコンストラクターに渡されるThread.Thread(ParameterizedThreadStart)デリゲート。 型 Object のパラメーターが 1 つあり、C# で void を返すメソッド、または Visual Basic の Sub プロシージャであるメソッドは、デリゲートを表すことができます。

メソッドが呼び出されるまで、スレッドの 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

C++ でインスタンス メソッドのデリゲートを作成 ParameterizedThreadStart する場合、コンストラクターの最初のパラメーターはインスタンス変数です。 静的メソッドの場合、コンストラクターの最初のパラメーターは 0 です。 静的メソッドの場合、デリゲート コンストラクターに必要なパラメーターは 1 つだけです。コールバック メソッドのアドレスは、クラス名で修飾されます。

ParameterizedThreadStartデリゲートとメソッドのThread.Start(Object)オーバーロードを使用すると、スレッド プロシージャにデータを簡単に渡すことができますが、この手法は型セーフではありません。これは、オブジェクトを にThread.Start(Object)渡すことができるためです。 スレッド プロシージャにデータを渡すより堅牢な方法は、スレッド プロシージャとデータ フィールドの両方をワーカー オブジェクトに配置することです。 詳細については、「 スレッドの作成」および「開始時刻にデータを渡す」を参照してください。

デリゲートは ParameterizedThreadStart 、1 つのパラメーターのみをサポートします。 複数のデータ項目を に渡すには、 ParameterizedThreadStart そのパラメーターを次のいずれかを指定します。

  • 配列。

  • すべてのデータ項目が同じ型である場合は、コレクション型。

  • Tuple<T1,T2,T3,T4>などのTuple<T1,T2>タプル型。

拡張メソッド

GetMethodInfo(Delegate)

指定したデリゲートによって表されるメソッドを表すオブジェクトを取得します。

適用対象

こちらもご覧ください