C# - System.Threading - Thread

クラウディア 
1. 概要
2. Thread
3. Thread.Sleep
4. スレッド ID
5. オブジェクト
6. Mutex

1. 概要

 基本的な部分から・・・。  本ページは、下記のサイトを参考にさせていただきました。
Thread クラス (System.Threading) 」
「Thread.Sleep メソッド (System.Threading)」
「Mutex クラス (System.Threading) 

2. Thread

 「Thread」は、基本的には、「new」で作成して、「Start」で起動、「Join」で終了を待つ動きになります。  下記のソースを書いて。

#pragma warning disable CS8602

using System;
using System.Threading;

public class Program
{
    static public void Main ()
	{
		myClass myclass = new myClass();
		myclass.run();
	}
}

public class myClass
{
	public myClass() {}

	public void run()
	{
		Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method start");

		Thread thread = new Thread(new ThreadStart(myThread));
		thread.Start();
		thread.Join();
	}

	private void myThread()
	{
		Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method start");

		for(int i=0; i<5; i++)
		{
			Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method " + i);
			Thread.Sleep(1000);
		}

		Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method end");
	}
}
 実行すると、下記の結果が得られます。

run          method start
myThread     method start
myThread     method 0
myThread     method 1
myThread     method 2
myThread     method 3
myThread     method 4
myThread     method end

3. Thread.Sleep

 「Thread.Sleep()」は、スレッド内でなくても使えます。

System.Threading.Thread.Sleep(Int32);
 「Int32」で指定した、ミリ秒数の間現在のスレッドを中断します。  「C#」には、「C++」のいわゆる、「Sleep」が存在しないので、これを使用します。  お手軽に使えますが、あまり正確な時間ではないそうです。

4. スレッド ID


System.Threading.Thread.CurrentThread.ManagedThreadId
 で、現在の自分のスレッド「ID」(Int32)を取得することができます。

5. オブジェクト

 これは、プロパティなのですが

System.Threading.Thread.CurrentThread
 が、自分自身のスレッドを指します。  これをどこか、他のスレッドで参照できる位置に置いておけば、他のスレッドからこのスレッドを操作できることになります。

6. Mutex

 参考サイトには、「同期プリミティブは、プロセス間の同期にも使用できます」と書いてあります。  ようわかりませんが。  「VC」を使用していた時に、二重起動防止のリリースとして使用していました。  起動時に特定の「Mutex」を作成しておいて、後発に起動しようとして、その「Mutex」が存在していれば、起動しない・・・みたいな。  排他等にも使用できます。  「C#」で、以前使用していた「VC」のプログラムとの間で同期をとる必要があって、使おうと思った次第です。  コンストラクタ。

Mutex (bool initiallyOwned, string name);
 1つめの引数が、「true」であれば、所有権を持ちます。  2つめの引数に、名称をつけます。わたしは、プリフィックスに「Global\」をつけています。

Mutex (bool initiallyOwned, string name);
 下記のように書けば。

Mutex Mutex = new Mutex(true, @"Global\Hogehoge");

・・・略・・・

Mutex.ReleaseMutex();
 最初の行で、「Mutex」を確保して、最後の行で開放することになるようです。
AbemaTV 無料体験
EMEET 1