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 つあり、値を返しません。

注意

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

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) オブジェクトがデリゲートに渡されます。

注意

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

注意

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

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

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

  • 配列。

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

  • タプル型 (または Tuple<T1,T2,T3,T4>. などTuple<T1,T2>)

拡張メソッド

GetMethodInfo(Delegate)

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

適用対象

こちらもご覧ください