Language

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 型の単一のパラメーターを持ち、値を返しません。

Note

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

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>やTuple<T1,T2,T3,T4>などのタプル型。

拡張メソッド

名前 説明
GetMethodInfo(Delegate)

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

適用対象

こちらもご覧ください