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 。つまり、型の1つのパラメーターを持ち、 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) 。 パラメーターを持たず、C# またはによって返されるすべてのメソッド void は、 Sub デリゲートを表すことが Visual Basic のプロシージャです。

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

メソッドが呼び出されるまで、スレッドは実行を開始しません Thread.StartThreadStartまたは ParameterizedThreadStart デリゲートがスレッドで呼び出され、デリゲートによって表されるメソッドの最初の行から実行が開始されます。 デリゲートの場合 ParameterizedThreadStart 、メソッドに渡されるオブジェクト Start(Object) はデリゲートに渡されます。

注意

Visual Basic と C# のユーザーは、 ThreadStart ParameterizedThreadStart スレッドの作成時にまたはデリゲートコンストラクターを省略できます。 Visual Basic では、 AddressOf メソッドをコンストラクターに渡すときに演算子を使用します。たとえば、のように Thread Dim t As New Thread(AddressOf ThreadProc) します。 C# では、単にスレッドプロシージャの名前を指定します。 コンパイラは、正しいデリゲートコンストラクターを選択します。

注意

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

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

デリゲートは、 ParameterizedThreadStart 1 つのパラメーターのみをサポートします。 次のいずれかのパラメーターを使用して、複数のデータ項目をに渡すことができ ParameterizedThreadStart ます。

  • 配列。

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

  • タプル型 (やなど) Tuple<T1,T2> Tuple<T1,T2,T3,T4>

拡張メソッド

GetMethodInfo(Delegate)

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

適用対象

こちらもご覧ください