次の方法で共有


方法 : 作成し、(C# Programming Guide) のスレッドを終了します。

[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]

次の使用例は、補助またはワーカー スレッドことができますを作成および使用をプライマリ スレッドに並列処理を実行する方法を示します。 別と正常に終了されるまで待つ 1 つのスレッドを行うスレッドも示します。 背景情報について詳細についてのマルチスレッド、「マネージ スレッド処理 および スレッド (C# Programming Guide) を使用

Worker 、 DoWork、ワーカー スレッドは実行するメソッドを含むというクラスを作成する例を示します。 ワーカー スレッドの Main 集計基本的です。 ワーカー スレッドはこのメソッドを呼び出すして実行を開始し、このメソッドが返ったときに自動的に終了します。 DoWork メソッドは、次のようになります。

                        public
                        void DoWork()
{
    while (!_shouldStop)
    {
        Console.WriteLine("worker thread: working...");
    }
    Console.WriteLine("worker thread: terminating gracefully.");
}

Worker クラスにを示す DoWork を返す必要がありますが使用される、追加の方法が含まれます。 このメソッドは RequestStop という名前し、次のようになります。

                        public
                        void RequestStop()
{
    _shouldStop = true;
}

RequestStop メソッドは、だけを _shouldStop 、 true のデータ メンバを割り当てます。 DoWork メソッドによってこのデータ メンバがオンになってため、これに間接戻るには、 DoWork のワーカー スレッドを終了します。 ただし、必要がありますわかります DoWork および RequestStop 別のスレッドによって実行されること。 DoWork が、ワーカー スレッドによって実行されは、 RequestStop のデータ メンバ宣言 _shouldStop 、このようなように、プライマリ スレッドによって volatile を実行します。

                        private
                        volatile
                        bool _shouldStop;

volatile キーワードを複数のスレッドは、 _shouldStop のデータ メンバにアクセスしてため、必要がありますいないこのメンバの状態に関するすべての最適化の前提データに、コンパイラ警告されます。 詳細については、「変動 (C# Reference)」を参照してください。

volatile データ メンバに _shouldStop の使用アクセスできるため安全にこのメンバのみが、正式なスレッドの同期手法を使用せずに複数のスレッドから _shouldStop が、 bool ためです。 これは 1 つだけ、アトミック操作が _shouldStop を変更する必要ことを意味します。 ただし、このデータ メンバは、クラス、構造体、または配列場合、複数のスレッドからへのアクセスは可能性があります原因で、断続的に発生データが破損します。 配列の値を変更するスレッドを検討します。 Windows は、定期的に他のスレッドを実行できるようにスレッドを中断します。 そのため、このスレッドしますが、他のユーザーを割り当てる前にいくつかの配列の要素を割り当てた後停止されます。 配列現在持っているため、プログラマが意図しない状態、別のスレッドをこの配列を読み取る失敗することがあります。

実際には、ワーカー スレッドを作成、する前に、Main 関数は Worker のインスタンスおよび、 Thread オブジェクトを作成します。 エントリとして、Worker.DoWork 方式を使用するようにスレッド オブジェクトを設定しては、 Thread コンストラクタは、次のようにこのメソッドへの参照を渡してポイント。

Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);

この時点で、ワーカー スレッドのオブジェクトが存在し、が構成されている、実際のワーカー スレッドがまだ作成されています。 これには、Main 、 Start メソッドを呼び出してするまでは発生しません。

        workerThread.Start();

この時点で、システム、ワーカー スレッドの実行を開始が、したがって非同期プライマリ スレッドにします。 つまり、Main 関数は、引き続き、ワーカー スレッドにすぐコードを同時に実行するときの初期化。 Main 関数をようにしようとしませんがある Main に、ワーカー スレッド オブジェクトの IsAlive プロパティが設定されるまで、 true 関数ループを実行する前に、ワーカー スレッドを終了します。

                        while (!workerThread.IsAlive);

次に、プライマリ スレッドが停止して一時的に Sleep への呼び出しでいます。 これにより、DoWork 関数は、複数のコマンドを実行する前にワーカー スレッドの DoWork 関数は、複数の反復計算の Main メソッド内のループを実行します。

        Thread.Sleep(1);

1 ミリ秒が経過した後は、Main メソッドを使用して終了するワーカー スレッド オブジェクトへの Worker.RequestStop 信号の導入以前。

        workerObject.RequestStop();

Abort への呼び出しを使用して別のスレッドからスレッドを終了することはも。 場合でもがそのタスクを完了していないリソースのクリーンアップのないできるように強制的に、影響を受けているスレッドを終了このします。 この使用例に示す方法お勧めします。

最後に、Main 関数は、ワーカー スレッド オブジェクトに、 Join メソッドを呼び出します。 このメソッドが、現在のスレッド ブロック、またはを待って、オブジェクトは、表しますしたスレッドを終了します。 したがって、ワーカー スレッド取得、それによって自体が終了されるまで Join は返されません。

        workerThread.Join();

この時点で、プライマリ Main を実行するスレッドにのみ存在します。 それを 1 つの最終的なメッセージを表示し、して返します、また、プライマリ スレッドを終了します。

次の例は、完了します。

使用例

                        using System;
using System.Threading;

publicclass Worker
{
    // This method will be called when the thread is started.publicvoid DoWork()
    {
        while (!_shouldStop)
        {
            Console.WriteLine("worker thread: working...");
        }
        Console.WriteLine("worker thread: terminating gracefully.");
    }
    publicvoid RequestStop()
    {
        _shouldStop = true;
    }
    // Volatile is used as hint to the compiler that this data// member will be accessed by multiple threads.privatevolatilebool _shouldStop;
}

publicclass WorkerThreadExample
{
    staticvoid Main()
    {
        // Create the thread object. This does not start the thread.
        Worker workerObject = new Worker();
        Thread workerThread = new Thread(workerObject.DoWork);

        // Start the worker thread.
        workerThread.Start();
        Console.WriteLine("main thread: Starting worker thread...");

        // Loop until worker thread activates.while (!workerThread.IsAlive);

        // Put the main thread to sleep for 1 millisecond to// allow the worker thread to do some work:
        Thread.Sleep(1);

        // Request that the worker thread stop itself:
        workerObject.RequestStop();

        // Use the Join method to block the current thread // until the object's thread terminates.
        workerThread.Join();
        Console.WriteLine("main thread: Worker thread has terminated.");
    }
}

ここでは、出力です。

main thread: starting worker thread...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: working...
worker thread: terminating gracefully...
main thread: worker thread has terminated

参照

参照

スレッド (C# Programming Guide)

スレッド (C# Programming Guide) を使用

Thread

変動 (C# Reference)

Mutex

Monitor

Start

IsAlive

Sleep

Join

Abort

概念

C# プログラミング ガイド

その他の技術情報

マネージ スレッド処理

スレッド処理のサンプル