Theread
コンセプト
C#オブジェクトにスレッドパッケージ(シールタイプ)ライブラリ
スレッドのインスタンス化と呼び出し
最初:
単にスレッド実行方法をする必要があります渡すスレッド
スレッドスレッド=新しいスレッド(のtestMethod); // 实例化スレッド
thread.Start(); // オープンスレッド実行方法。
第2
使用するラムダ式を
スレッドスレッド=新しいスレッド(S =>
{
Console.WriteLineを( " HA ");
}
);
thread.Start();
第三の
システムパッケージでスレッドクラス
私たちは見ることができないスレッドを受信する必要があるThreadStartの信頼の戻り値なしで、実際には、パラメータの種類、およびこのタイプをしてから見下ろす無引数を
// ThreadStartの手数料は、パラメータと戻り値ではありません
ThreadStart threadStart =()=>
{
Console.WriteLineを( " 测试");
}。
=新しいスレッド(threadStart)をthreadRunStartスレッド。
threadRunStart.Start();
スレッド一般的な方法を
待って
1つの分析スレッドのThreadState
ThreadState の初期状態未開始(起動しません)
しばらく(thread.ThreadState!= ThreadState.Stopped)
{
Thread.sleep(200); // 現在のスレッドのブレーク200msの
}
2参加待っています
thread.Joinは(); // を待って、このコードのスレッドを実行するスレッドが完了するまでに
thread.Join(1000); // まで待って1000ミリ秒
最高の優先順位
優先順位は、しかし、完了するために優先順位表すものではありません 、でも極端な例で言うと
このスレッドで実行順序を制御しない事故があり、
thread.Priority = ThreadPriority.Highest。
フロントとバックのスレッド
フォアグラウンドスレッド
thread.IsBackground =偽; // デフォルトはfalseをフォアグラウンドスレッド、プロセスが閉鎖され、スレッドが唯一の出口の後に計算する必要があります
バックグラウンドスレッド
thread.IsBackground =真; // プロセスを閉じ、糸出口
明確の理解とスレッドの使用を容易にするために、パッケージの2つの簡単な例を次のようにします
要件の説明:コールバック:プロモーターのスレッドがアクションBを実行するために、サブスレッドの実装後のアクションA-- -A-の実施を阻止しません
#regionの使用スレッド封装回调 { ThreadStart threadStart =()=> この .DoSomethingLong(" をbutton3_Click " )。 アクションactionCallBack =()=> { のThread.sleep(2000 ); Console.WriteLineを($ " {これはCalllback Thread.CurrentThread.ManagedThreadId.ToStringある(" 00 " )} " ); }。 この.MethodThread(threadStart、actionCallBack)。 } #endregion
// コールバック:プロモータースレッドはアクションB実行するサブスレッドの実装後に作用A-- -A-の実装を妨げない /// <まとめ> /// 方法は、発信者が実行のスレッドを渡し:アイデアを /// 転写スレッドBを実行する方法 /// </要約> /// <PARAM NAME = "threadStart"> </ PARAM> /// <PARAM NAME = "アクション"> </ PARAM> 公共 ボイドMethodThread(threadStart threadStartをアクションアクション) { // エラーの典型的な理由:この方法は、ブロックされているため // スレッド新しい新しい=スレッド(threadStartスレッド); // Thread.Start(); // Thread.join(); // action.Invoke() ; // 特定のアイデア: //ThreadStartパラメータとアクションパラメータは、戻り値委託ませんされていません 。// 最初に来る呼び出しを実行する必要があり、実行待ちが終了した後、次の起動実行される // ThreadStartラップでは、方法として渡され、連続的に満足して行われ、そしてません詰まら ThreadStartの_startを= 新しい新しいThreadStart( () => { threadStart.Invoke(); action.Invoke(); } ); 新しい新しいスレッド(_start).Start(); }
要件の説明:1、非同期は、非ブロッキングが最終結果に到達2'll
#regionの非同期呼び出しカプセル化された使用糸は、値を返す { のFunc < int型 > FUNC =()=> { のThread.sleep(5000 ); 戻る; DateTime.Now.Year }; FUNCキー < 整数 > = funcThread この .ThreadWithReturn(FUNC) ; // 非ブロック int型 iResult = funcThread.Invoke(); // 閉塞、本当に結果を取得する必要があります。 } #Endregion
/// <まとめ> /// 1、非同期、非ブロッキング /// 2は、最終的な計算結果を得ることができる /// </要約> /// <typeParam名= "T"> </ typeParam> // / <PARAM NAME = "FUNC"> </ param>の /// <リターン> </リターン> プライベートのFunc <T> ThreadWithReturn <T>(機能<T> FUNC) { // アイデアの実現:戻り値を渡しますジェネリックデリゲート // ThreadStartデリゲート包まスレッドと、スレッドの開始を渡すとは // ジェネリックデリゲートの戻り値を返す T T = デフォルト(T)を、 ThreadStart threadStart = 新しい新しい ThreadStart(()=> { トン= Func.Invoke(); }); スレッドのスレッドは = 新しい新しいスレッド(threadStart); Thread.start(); // Invokeメソッドなしで実行されない手数料は // 呼び出し側が等デリゲート、最初のスレッドの実行を呼び出すまで待ちます、および次いで(ブロッキング)を返す 戻り 新しい新規のFunc <T>(()=> { Thread.joinを(); 戻りTを; ;}) }