1.方法1:ParameterizedThreadStartデリゲートを使用
するデリゲートParameterizedThreadStartの場合、スレッドのエントリはオブジェクトパラメータのタイプを持ち、タイプvoidを返す必要があります。システムを使用して
コードを表示します。System.Threadingを使用します。
名前空間ThreadWithParameters
{
クラスプログラム
{ staticvoid
Main(string [] args)
{
string hello =“ hello world”;
//这里也可简写成Thread thread = new Thread(ThreadMainWithParameters);
//但是为了让大家知道这里用的是ParameterizedThreadStart委托,就没有简写了
Thread thread = new Thread(new ParameterizedThreadStart(ThreadMainWithParameters));
thread.Start(hello);
Console.Read();
}
static void ThreadMainWithParameters(object obj)
{
string str = obj as string;
if(!string.IsNullOrEmpty(str))
Console.WriteLine("Running in a thread,received: {0}", str);
}
}
}
上記のコードは唯一つのパラメータを渡すことができる。我々は、スレッドに複数のパラメータを渡す時々場合は、その方法には制限があります(クラスがパラメータを渡すためにオブジェクトとして使用される場合、別のクラスを作成する必要があり、また少し厄介です)
このメソッドを使用する場合、ThreadMainWithParametersメソッドのパラメーターはオブジェクトタイプである必要があり、タイプ変換を実行する必要があることに細心の注意を払う必要があります。この方法はお勧めしません。
2. 2番目の方法:クラスのカスタムクラス
定義を作成します。これは、インスタンスメソッドのメインスレッドクラス定義のメソッドで必要なフィールドを定義します。実際の例を参照してください。Systemを使用して
コード
を表示;
System.Threadingを使用;
名前空間ThreadWithParameters
{
パブリッククラスMyThread
{
プライベート文字列データ;
public MyThread(string data)
{
this.data = data;
}
public void ThreadMain()
{
Console.WriteLine("Running in a thread,data: {0}", data);
}
}
class Program
{
static void Main(string[] args)
{
MyThread myThread = new MyThread("hello world");
Thread thread = new Thread(myThread.ThreadMain);
thread.Start();
Console.Read();
}
}
}
このメソッドは、ビット面倒であり、そしてそれは私が集中したいものではありません。必要であれば、私はそれを自分自身を使用することができます。
3. 3つの方法:ラムダ式
にラムダ式を使用することに慣れていない場合は、MicrosoftMSDNのドキュメントを参照してください。ここではおなじみの方を前提としています。ほとんどの場合、デリゲートを使用する場合、ラムダ式を使用できます。Systemを使用して
コード
を表示;
System.Threadingを使用;
名前空間ThreadWithParameters
{
クラスプログラム
{ staticvoid
Main(string [] args)
{
string hello =“ hello world”;
//如果写成Thread thread = new Thread(ThreadMainWithParameters(hello));这种形式,编译时就会报错
Thread thread = new Thread(() => ThreadMainWithParameters(hello));
thread.Start();
Console.Read();
}
static void ThreadMainWithParameters(string str)
{
Console.WriteLine("Running in a thread,received: {0}", str);
}
}
}
この方法3は、推奨される方法として使用することができ、コードはシンプルで私たちが使用するのに便利です。上記の3番目の方法では、ラムダ式について説明しています。ラムダ式を使用できるため、デリゲートも使用できます。以下の主な説明は、この方法を使用することです。
4.方法3:デリゲートを使用して
Multhd = new Thread [ThreadCount];
thread_Separate_baseCount = C_num / ThreadCount; //スレッドあたりの端末数
listViewEx2.Items.Clear();
for(int j = 0; j <ThreadCount; j ++ )
{
if(j == ThreadCount-1)//最後のスレッド
{
Multhd [j] = new Thread(delegate(){Run2(j * thread_Separate_baseCount、C_num-1);});
}
else //その他のスレッド
{
Multhd [j] = new Thread(delegate(){Run2(j * thread_Separate_baseCount、(j + 1)* thread_Separate_baseCount-1);});
}
}
上記のコードRun(arg1、arg2 .....、argn)は私たち自身です定義されたメソッド、このメソッドでは、任意の数のパラメーターを設定でき、単純であると見なすことができます。
上記のコードは完全に実行でき、バグなどはありませんが、実際の実行状況には驚かされます。forループを使用してスレッドを作成する場合、スレッドを閉じて再起動しても問題はありません。ただの糸なので、何も悪いことはないかもしれません。しかし、スレッドを閉じて再度開く(ターミナルを閉じて開く必要があります)が2つ以上ある場合、プログラムはエラーを報告せず、デバッガーは問題なく、コンピューターが警告なしにシャットダウンすることがあります。警告なしにシャットダウンすることは致命的な問題であり、誰も望んでいません。偶然だと思ったのですが、何度も繰り返しても結果は同じで、偶然の必然性が存在するに違いありません。
1つのスレッドで問題がないのはなぜですか?複数のスレッドが実行されている場合、スレッドは何よりも同じデリゲートのアドレスを指しているため、警告なしにシャットダウンが発生しますか?これらは私たちが確認するのを待っています。
再版場所:https://www.cnblogs.com/lvdongjie/p/5416883.html