C#のスレッドの問題

まず、マルチスレッドは、引数を指定して呼び出します

#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最大{ GETSET ;} 

        公共 のintミン{ GETSET ;} 

    } 

            #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(5000 )); 

            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 ++ ; 
    } 
}

 

おすすめ

転載: www.cnblogs.com/peterYong/p/10886441.html