2

以下に説明するように、WriteXメソッドを実行する2つのセカンダリスレッドがあります。

    static void Main(string[] args)
    {

        ThreadStart one = new ThreadStart(WriteX);
        Thread startOne = new Thread(one);
        ThreadStart two = new ThreadStart(WriteX);
        Thread startTwo = new Thread(two);
        startOne.Start();
        startTwo.Start();
        Console.ReadKey(true);
    }

    public static void WriteX()
    {
        for (int i = 1; i <= 3; i++)
        {
            Console.WriteLine("Hello");
            Thread.Sleep(1000);
        }
    }

(1)「startOne」と「startTwo」がタスクを完了するのにかかる時間(ミリ秒単位)を確認するにはどうすればよいですか?

(2)スレッドを開始しました(Start())。実行が成功したときにスレッドを停止する必要はありませんか、それともプライマリスレッド(この場合はMain())によって処理されますか?

(3)startOneがWriteX()メソッドを実行し、startTwoがWriteX()メソッドを実行しているというメッセージを出力するにはどうすればよいですか?

4

3 に答える 3

1

すべての深刻なロギングフレームワークでは、出力メッセージにスレッドIDまたはスレッド名を含めることができます。コンソールを使用するだけの場合は、現在のスレッドID/名前をメッセージに手動で追加する必要がある場合があります。

そのようです:

public static void WriteX()
{
    var sw = Stopwatch.StartNew();
    for (int i = 1; i <= 3; i++)
    {
        Console.WriteLine("Hello");
        Thread.Sleep(1000);
    }
    sw.Stop();
    Console.WriteLine("{0} {1}", 
                      Thread.CurrentThread.ManagedThreadId, 
                      sw.Elapsed);
}

スレッドに名前を付けるには、スレッドインスタンスのNameプロパティを使用するだけです。

ThreadStart one = new ThreadStart(WriteX);
Thread startOne = new Thread(one);
startOne.Name = "StartOne";

//...

Console.WriteLine("{0} {1}", Thread.CurrentThread.Name, sw.Elapsed);

また、コンストラクター引数として渡すメソッドがThreadStart終了すると、スレッドは自動的に終了します。Joinメインスレッドでスレッドが終了するのを待つ場合は、このメソッドを使用します。

于 2009-10-09T08:38:52.103 に答える
0
  1. WriteX()前後の現在の時間を節約するものでラップし(または単に最初と最後でそれを行いWriteX())、最後に差を印刷します。

  2. メソッドがfinishに渡されるThreadStartと、スレッドはそれ自体を終了します(そしてそれ自体をクリーンアップします)

  3. 繰り返しWriteX()ますが、ロギングを行うものでラップします。ソースを見て、ThreadStartそれがどのように実装され、どのように拡張/ラップできるかを確認することをお勧めします。

私が何について話しているのかわからない場合は、この記事が役立つかもしれません。

于 2009-10-09T08:32:39.300 に答える
0
  1. 2つの独立したタスクの実行時間の合計を取得するか、最大のタスクを取得するかによって異なります。最初のケースでは、WriteX内で必要な時間を測定する必要があります。startOneの前の2番目のケースでは、両方が終了したら測定を停止します。Stopwatchどちらの場合も使用してください。

  2. Thread.Join両方のスレッドが終了するまで待機するために使用します。

  3. パラメータ化された開始を使用Thread.Start(object)し、そこにタスク名を渡します。

于 2009-10-09T08:36:44.627 に答える