まず、マルチスレッドは、引数を指定して呼び出します
#regionのパラメータでマルチスレッド MyThreadスレッド = 新しい新しいスレッド(新しい新しいParameterizedThreadStart(計算)); mythread.IsBackground = trueに、 mythread.Start(500 ); #endregion プライベート 無効計算(オブジェクトマックス) // パラメータでデリゲート関数 { int型の最大値=(INT )MAX; ザ・ストップウォッチストップウォッチ = Stopwatch.StartNew(); のため(intです I = 0 ; Iは、MAXを<; I ++) { のThread.sleep(5 )。 } stopwatch.Stop()。 長い lSearchTime = stopwatch.ElapsedMilliseconds。 MessageBox.Show(lSearchTime.ToString() + " 毫秒" ); }
一つの方法は次のようにクラス、パラメータ値はクラス属性に割り当てられ、パラメータは、クラスのプロパティとして渡される、クラスを定義するには、二つのパラメータ、パラメータの同じ複数のパラメータは、次のコード例として伝達され:
クラスMyClassの { 公共 のint最大{ GET、SET ;} 公共 のintミン{ GET、SET ;} } #region実施例:複数のパラメータを有する複数の実行スレッド MyClassのモデル = 新しい新しいMyClassの(); model.Max = 500 ; model.Min = 0 ; スレッドmythread1 = 新しい新しいスレッド(新しい新しいParameterizedThreadStart(CalculateTwo)); mythread1.IsBackground =trueに、 mythread1.Start(モデル); #endregion プライベート ボイド CalculateTwo(オブジェクト MyClassのを) // 複数のパラメータを持つデリゲート機能 { MyClassのモデル = (MyClassの)MyClassの、 ストップウォッチストップウォッチ = Stopwatch.StartNew(); のため(int型 I = model.Min; I model.Maxを<; Iは++ ) { のThread.sleep(5。); } stopwatch.Stop(); ロング lSearchTime = stopwatch.ElapsedMilliseconds。 MessageBox.Show(lSearchTime.ToString() + " 毫秒" ); }
第二の方法:ラムダ式の方法で、簡単で便利な、
コードは以下の通りであります:
#region第二の方法:複数のパラメータを持つマルチスレッド実行 スレッドmythread2 = 新しい新しいスレッド(()=> CalculateThree(500、0 )); mythread2.IsBackgroundが = trueに ; // 、バックグラウンドスレッドに設定されたプログラムは、プロセスを停止した後trueに設定されていない場合、プログラムが閉じている、閉じ、スレッドがメモリに残っている、閉じない mythread2.Start(); #endregion プライベート ボイド CalculateThree(INT最大、int型分) // 複数のパラメータを持つデリゲート関数 { ストップウォッチストップウォッチ = Stopwatch.StartNew(); のため(int型私はマックス<;; I =ミンをI ++) { のThread.sleep(5 )。 } stopwatch.Stop()。 長い lSearchTime = stopwatch.ElapsedMilliseconds。 MessageBox.Show(lSearchTime.ToString() + " 毫秒" ); }
第二のスレッド安全性の問題、静的変数と静的メソッド
内部静的メソッドは、作成ローカルパラメータは、スレッドセーフである静的メソッドを呼び出して、次のように、それらは、静的メソッドを作成するコード例を、内部パラメータを共有しないであろう別のスレッドで、
パブリック 静的 ボイド試験() { int型 I = 0 。 Console.WriteLineを(I); I ++ ; }
上記のコードでは、iは異なるスレッド間で共有されていない変数は、各スレッドは、出力が1である、異なるメソッドを呼び出します。
静的変数は異なるスレッド間で共有されている、我々は、スレッドの安全性の問題に関するものであり、それは、静的変数の静的メソッドが動作するとき、私たちは皆知っていると信じて:
プライベート 静的の int型 I = 0 ; パブリック 静的 ボイド試験() { Console.WriteLineを(I)。 I ++ ; }
このコードは、別のスレッドによって操作されたとき、そこにスレッドの安全性の問題があるので、それはロックされなければなりません
プライベート 静的の int型 I = 0 ; パブリック 静的 ボイド試験() { ロック(本) { Console.WriteLineを(I)。 I ++ ; } }