久しぶりにThreadクラスについてです。
過去の記事は、以下から見れます。
- .NET クラスライブラリ探訪-020 (System.Threading.Thread (1))(Thread.Start, ThreadStart, ParameterizedThreadStart, Join, Sleep)
- .NET クラスライブラリ探訪-021 (System.Threading.Thread (2))(スレッドローカルストレージ, TLS, GetData, SetData, LocalDataStoreSlot)
- .NET クラスライブラリ探訪-023 (System.Threading.Thread (3))(IsAlive, IsThreadPoolThread, ManagedThreadId, Priority)
.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
が表示されていますので、またタイムスライスが切り替わっている事が分かります。
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場