2

我有两个辅助线程,它们执行如下所述的方法 WriteX:

    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. 当传递给的方法ThreadStart完成时,线程会自行终止(并自行清理)

  3. 再次,包装WriteX()一些记录日志的东西。我建议查看源代码ThreadStart以了解它是如何实现的以及如何扩展/包装它。

如果你不知道我在说什么,这篇文章可能会有所帮助。

于 2009-10-09T08:32:39.300 回答
0
  1. 这取决于您是要获得两个独立任务的执行时间之和还是最大的一个。在第一种情况下,您需要在 WriteX 中测量所需的时间。在 startOne 之前的第二种情况下,当两者都完成时停止测量。在这两种情况下使用Stopwatch

  2. 用于Thread.Join等待两个线程都完成。

  3. 使用参数化启动Thread.Start(object)并在那里传递任务名称。

于 2009-10-09T08:36:44.627 回答