.NET を理解する8
スレッド覚えてみる
というか半分以上復習。スレッドの立て方一覧。
厳密にはスレッドとは違うけど、非同期実行できるものは列挙。
- delegate の BeguinInvoke 経由でメソッドを非同期実行する。
- System.Threading.Thread クラスインスタンスからスレッド実行する。
- System.Threading.ThreadPool で簡易スレッドを実行する。
だったかなーまぁサクッとサンプルを書く。
まずは BeginInvoke 経由で非同期にメソッドを起動する。
普通は終了通知をメソッドで受け取ります。
static void Main(string[] args) { TestDelegate test = delegate() { for (int i = 0; i < 20; i++) { Console.WriteLine(i); System.Threading.Thread.Sleep(500); } }; // call method as ansync test.BeginInvoke(null, null); Console.WriteLine("Thread is running."); System.Threading.Thread.Sleep(11000); }
次に普通にスレッド作る。
普通に作る場合、スレッド待機とか、推奨されないけどサスペンド、レジュームとかできます。
static void Main(string[] args) { // call method as ansync System.Threading.Thread threads = new System.Threading.Thread( new System.Threading.ThreadStart(Samplethread)); threads.Start(); Console.WriteLine("Thread is running."); threads.Join(); } static void Samplethread() { for (int i = 0; i < 20; i++) { Console.WriteLine(i); System.Threading.Thread.Sleep(500); } }
最後にスレッドプール。
一瞬で終わるよーな簡単な処理向け。スレッドクラス作ったりとかいうオーバーヘッドが小さい。
見て分かるとおり、キューに溜め込むことができて、メモリの続く限りいけるそーな。
一度に動くスレッド数には限界があるとのことです。
static void Main(string[] args) { // call method as ansync System.Threading.ThreadPool.QueueUserWorkItem( new System.Threading.WaitCallback(Samplethread)); Console.WriteLine("Thread is running."); System.Threading.Thread.Sleep(11000); } static void Samplethread(object obj) { for (int i = 0; i < 20; i++) { Console.WriteLine(i); System.Threading.Thread.Sleep(500); } }
良く使うのは、スレッドかスレッドプール。
デリゲート経由の場合は、、、、、何か微妙かも?
他に関連のありそうなクラスはこんな感じ。
- ExecutionContext 複数のスレッドでデータ(コンテキスト)を共有するのに使うクラス。これには、セキュリティ コンテキスト、呼び出しコンテキスト、および同期コンテキストが含まれます。
- Interlocked 足し算引き算、読み取り比較なんて処理をクリティカルな処理として実行するクラス。整数とか値ばっかなのでこれまた微妙w多分速度的にはめっさ早い。
- Monitor データロックの為の仕組み。同期オブジェクトを使うやつ。
- ReaderWriterLock 複数のスレッドから読めはするけど、書き込みは特定スレッドからしかできないという何とも都合のよさげなオブジェクト管理をするクラス。
- Mutex Win32 からお世話になってるプロセス間同期の取り方。管理はまだ windows でやってるんだろーか?
- Semapho リソースへの同時アクセスの最大数を制限する。
何か結構あるので、サンプルはあんまし書きたくないなぁ。
一番不明なのは ExecutionContext か、、、、
明日サンプル書いてみよう。