いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-041 (System.Threading.Thread (4))(Yield, タイムスライス切り替え, .NET 4.0)


久しぶりにThreadクラスについてです。
過去の記事は、以下から見れます。


.NET 4.0から、Threadクラスに以下のメソッドが追加されています。

public static bool Thread.Yield()


Yieldメソッドは、静的メソッドで、実行するとタイムスライスを切り替えてくれます。
今までは

Thread.Sleep(0)

とかしていた部分を、今後はこれで置き換えることが出来ます。
戻り値は、タイムスライスの切り替えが成功したか否かです。


以下、サンプルです。

    #region ThreadingNamespaceSamples-04
    public class ThreadingNamespaceSamples04 : IExecutable
    {
        public void Execute()
        {
            //
            // .NET 4.0より、Threadクラスに以下のメソッドが追加された。
            //     ・Yieldメソッド
            //
            // Yieldメソッドは、別のスレッドにタイムスライスを引き渡す為のメソッド。
            // 今までは、Thread.Sleepを利用したりして、タイムスライスを切り替えるよう
            // にしていたが、今後はこのメソッドを利用することが推奨される。
            //
            // 戻り値は、タイムスライスの引き渡しが成功したか否かが返ってくる。
            //
            
            //
            // テスト用にスレッドを2つ起動する.
            //
            Thread t1 = new Thread(ThreadProc);
            Thread t2 = new Thread(ThreadProc);
            
            t1.Start("T1");
            t2.Start("T2");
            
            t1.Join();
            t2.Join();
        }
        
        void ThreadProc(object stateObj)
        {
            string threadName = stateObj.ToString();
            Console.WriteLine("{0} Start", threadName);
            
            //
            // タイムスライスを切り替え.
            //
            Console.WriteLine("{0} Yield Call", threadName);
            bool isSuccess = Thread.Yield();
            Console.WriteLine("{0} Yield={1}", threadName, isSuccess);
            
            Console.WriteLine("{0} End", threadName);
        }
    }
    #endregion


実行すると、例えば以下のようになります。

  T1 Start
  T1 Yield Call
  T2 Start
  T2 Yield Call
  T1 Yield=True
  T1 End
  T2 Yield=True
  T2 End
T1 Yield Call

のすぐ後でYieldを呼び出しています。
その後、すぐに

T2 Start

が来ているので、タイムスライスが切り替わっていることが分かります。
同じく、

T2 Yield Call

のすぐ後で

T1 Yield=True

が表示されていますので、またタイムスライスが切り替わっている事が分かります。



================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。