この資料の冒頭から、私は2件の記事がスレッドの基本を説明し使用しますが、この記事では、必要とするスレッドの作成、スレッドの待機、スレッドが中断し、スレッドの終了と、スレッドの状態の検出に関連するコンテンツを。ちょうど記事を読んだ後、固体を築くために、あなたの他のスレッドを追跡できるようにするために、説明するのは簡単この記事と次の記事では話題の基礎の基礎であるので、私は例のコード言語を使用し、基盤。あなたは、基本的なC#言語およびMicrosoft Visual Studioの2015年および上記のいずれかのバージョンを持っている必要がありますこの記事を学びます。
いわゆるスレッドは、オペレーティング・システムは、コンピューティングユニットは、仮想プロセスの多数に分割されているいくつかの方法を使用して、これらの仮想プロセスを特定のコンピューティングパワーを与えています。忙しいです、そのプログラムを実行することはできませんし、時にはオペレーティングシステム自体の作成と使用のため、マルチスレッドのオペレーティングシステムプロセスのみが存在するとき、シングルコアがこれらのスレッドを管理するためにオペレーティングシステム原因のプロセッサをマルチスレッドだから、多くの資源を消費していることに留意すべきですこれは、(プロセッサに最も優先順位の高いオペレーティングシステムへのアクセスは、それはまだこの問題に直面するとしても)正常に動作しません。したがって、現在の主流のプロセッサは、マルチコアプロセッサであり、電力を計算することは非常に高いが、我々は改善ハードウェアとソフトウェアの開発を無視することができない、開発言語の現在の主流は、マルチスレッドサポート。ADOは今、私たちは最初のポストスレッドの基礎を始めます。
まず、スレッドを作成します
スレッドを作成する方法は非常に簡単です、我々は唯一のインスタンス化する必要がありますスレッドを呼び出した後、我々はプロセスのインスタンスに新しいスレッドで実行するような方法は、スレッドに渡され、に、と開始新しいスレッドを実行する方法を。スレッドを作成するコードを見てみましょう。
using System;
using System.Threading;
namespace CreateThread
{
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(PrintNumber);
thread.Start();
PrintNumber();
Console.Read();
}
static void PrintNumber()
{
for (int i = 0; i < 20; i++)
{
Console.WriteLine($"第 {i + 1} 个数字是 {i}");
}
}
}
}
どこ名前空間のスレッドを使用して、使用上のコードの2行目では、導入System.Threading我々はプログラムクラスの静的メソッドを作成した後、PrintNumber、この方法では、我々はループを書くには、コンソール・サイクルで2を印刷します10桁の数字。その後、我々はスレッドに渡すことをされた私たちは、メインメソッドでスレッドをインスタンス化し、静的メソッドの前で、私たちはPrintNumberはスレッド、ここで注意すべきにパラメータとして渡さ定義するパラメータのThreadStartタイプで、ThreadStartデリゲートをすべき表しこの方法は、このデリゲートは、このメソッドを呼び出す前に呼び出しThread.Start方法まで、スレッドのコンストラクタに、スレッド上で実行しました。最後に、我々は新たに作成されたスレッドを実行するスレッドのStartメソッドを呼び出します。コードの十二行は、我々は比較を行うためには、その後、通常の方法でPrintNumberメソッドを呼び出します。その後、我々は、コードを実行するには、次の2つのコール無作為化クロスオーバー表示されるコンテンツを出力するPrintNumber方法が表示されます。
ヒント:
- 我々はスレッドインスタンス化すると、ThreadStartまたはインスタンスParameterizedThreadStart手数料は、コンストラクタに渡されます。私たちは、C#コンパイラがバックグラウンドでこれらのオブジェクトを作成し、名前を実行する方法の異なるスレッドを指定する必要があります。
- プロセスにあるスレッド、少なくとも一つのスレッドが含まれており、ミッションのメインスレッドのプロセスが常にあるプロセス。
第二に、スレッドが待機
プログラムのニーズは、我々が使用する必要が別のスレッドの結果を使用する場合は入会方法を、の役割は、メソッドが呼び出したスレッドが呼び出したスレッド(子スレッド)を待って、実行が完了した後に実行されているように、実行するために呼び出しスレッドをブロックすることで参加します。子スレッドが終了するまでの方法は、単純に現在のメソッド呼び出しのサブスレッドに差し込むれ参加。我々は2つのスレッド間のステップを同期させるために、このメソッドを使用することができます。私たちは、参加確認するために、コードを次の方法の使用を見てください。
using System;
using System.Threading;
namespace ThreadWait
{
class Program
{
static int count = 0;
static void Main(string[] args)
{
Thread thread = new Thread(PrintNumber);
thread.Start();
thread.Join();
PrintNumber();
Console.WriteLine(count);
Console.Read();
}
static void PrintNumber()
{
for (int i = 0; i < 20; i++)
{
count+=i;
}
}
}
}
私たちは、完成皇帝スレッドが通常の方法では、メインスレッドの呼び出しを実行していきます時に実行されている結果のスレッドスレッドスレッドスレッドを使用する必要があるため、我々は呼んで上記のコードの行13は、メインスレッドを待機させる方法を参加しますPrintNumber法、カウント値がPrintNumber 0に初期化されていない場合、むしろスレッド190の実行結果のスレッドを介して、PrintNumberを再計算を介して、結果は、最終出力380です。私たちが参加メソッドを使用しない場合、出力は知られていません。
第三に、スレッドが中断され
例えば、我々は、Windowsのサービスまたはキル・プロセスを停止する必要がある場合、(この2つのケースに限定されない)、退出ロジックの存在に応答して、サービスまたはプロセス、そして、私たちはすぐにフォローアップすることはできませんメインプログラムコードの実装に、完全にリアのうち、サービスまたはプロセスを待つ必要後続のコードを実行することができます。サービスが停止または現在のプロセスの手順キルプロセスではありませんので、しかし、また、我々は、我々が使用することができ、メソッドは待機に参加してメインスレッドを作ることができない睡眠時間の経過後に実行を停止するためにメインスレッドを取得する方法をその後のコード(この方法は、我々だけ説明し、それを使うことになる最善の方法ではありません)。睡眠の方法は、2ミリ秒の単位は、int型、パラメータのパラメータが渡さ懸濁長いスレッドを表している、オーバーロードしています。オーバーロードの別のタイプは、パラメータは、時間中断されたスレッドの量を表す、のTimeSpanパラメータを渡されます。次のコードは、都市が一定の長さに落ちた後キルポーズをシミュレートすることです。
using System;
using System.Diagnostics;
using System.Threading;
namespace ThreadPause
{
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(KillProcess);
thread.Start();
Console.ReadLine();
}
static void KillProcess()
{
Process process = Process.GetProcessesByName("notepad")[0];
process.Kill();
Thread.Sleep(20);
if (Process.GetProcessesByName("notepad").Length == 0)
{
Console.WriteLine("已被Kill");
}
}
}
}
上記のこれは本当に複雑なプロジェクトである避けるために、ちょうどシミュレーションです。時々我々はコードでそのような文言が表示されますことに留意すべきThread.Sleep(0)
パラメータ値が0であるとき、そのタイムスライスのスレッド意志の残りができるように、このようなアプローチではなく、平均一時停止0ミリ秒を行い、基本的な意味を同じ優先度のスレッドで実行する準備ができて誰にも。同じ優先度のスレッドで、実行に、他の準備ができている場合、それは現在のスレッドの実行を一時停止しません。
ヒント:
- スレッドが休止しているとき、それは少しCPU時間として取り上げます。
第四に、スレッドの終了
比較的小さいと実際の開発でのスレッドの終了は、唯一、私は、使用糸終了までの状況・ニーズが発生していないビューのプロジェクト開発のポイントでの私の経験によると、非常に特殊な状況下で使用の最初のを見てみましょうしますコード。
using System;
using System.Threading;
namespace ThreadStop
{
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(PrintNumber);
thread.Start();
Thread.Sleep(200);
thread.Abort();
Console.Read();
}
static void PrintNumber()
{
for (int i = 0; i < 1000; i++)
{
Console.WriteLine($"第 {i + 1} 个数字是 {i}");
}
}
}
}
200ミリ秒のスレッド呼び出した後に実行されているコードが始まる中止スレッドが失われているので、この方法は、我々は完全に下の図から完成していなかった糸で出力ループを見ることができ、継続してスレッドを終了するために、我々は終了しました。中止方法は、スレッドへの呼び出しと同じですThreadAbortExceptionののスレッドが終了する原因方法。それは簡単にアプリケーションを破壊することができ、この例外に例外を紹介するので、しかし、ここでは、そうするための手順は非常に危険であることを思い出させる必要があります。そしてニーズはスレッド処理により終了し、これを呼ぶべきThread.ResetAbortの終了することを拒否するための方法。私は今後の記事では、この問題を解決する方法について説明します。
第五に、状態が検知されたスレッド
多くの場合、スレッドの状態検出は、C#でのスレッドの現在の状態が10、下の表でこれらの10の州があり、使用されます。一般的に使用される状態にはしていた実行、未開始、停止およびWaitSleepJoinを。
状態 | 説明 |
---|---|
ランニング | スレッドが開始されています |
StopRequested | 私たちは、スレッドが停止を要求しています |
SuspendRequested | 要求しているスレッドが中断されています |
バックグラウンド | スレッドは、バックグラウンドスレッドとして実行されます |
未開始 | スレッドが起動しません |
停止 | スレッドが停止しました |
WaitSleepJoin | スレッドがブロックされています |
一時停止 | スレッド中断 |
AbortRequested | スレッドが停止しています |
中止されました | スレッドが終了したが、状態が停止されていません |
最初は、スレッドの状態で未開始状態は、スレッドが開始になったときに、この時間は、スレッドは、起動しないので、実行している、我々はスレッド状態になるSleepメソッドを呼び出すか、参加したときに、WaitSleepJoin。スレッドの状態が後にスレッドを終了中止されたが、そこかもしれAbortRequested。スレッドが終了するとステータスがされます停止します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadState
{
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(PrintNumber);
Console.WriteLine("线程状态:" + thread.ThreadState);
thread.Start();
for (int i = 0; i < 20; i++)
{
Console.WriteLine("线程状态:" + thread.ThreadState);
}
}
static void PrintNumber()
{
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(2000);
}
}
}
}
第六に、仕事
- 新しい複数のスレッド、複数のプロセスのそれぞれ、終結および懸濁液、およびその後の状態を表示します。
七、ソースコードのダウンロード
現在のソースコードのダウンロード: