线程 - 模拟执行时间

时间:2009-10-09 08:24:48

标签: c# multithreading simulation

我有两个辅助线程,它们执行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)我启动了Thread(Start())。我不需要在成功执行时停止线程,还是由主线程处理(本例中为Main())?

(3)如何打印消息说,startOne正在执行WriteX()方法而startTwo正在执行WriteX()方法?

3 个答案:

答案 0 :(得分: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方法。

答案 1 :(得分:0)

  1. WriteX()包裹在保存前后当前时间的内容中(或者只是在WriteX()的开头和结尾处执行)并在结尾处打印差异。

  2. 当传递给ThreadStart的方法结束时,线程自行终止(并自行清理)

  3. 再次,将WriteX()包装在执行日志记录的内容中。我建议查看ThreadStart的来源,看看它是如何实现的,以及如何扩展/包装它。

  4. 如果您不知道我在说什么,this article可能有帮助。

答案 2 :(得分:0)

  1. 这取决于您是否想要获得两个独立任务或最大任务的执行时间总和。在第一种情况下,您需要在WriteX中测量所需的时间。在startOne之前的第二种情况下,当两者完成时停止测量。在这两种情况下都使用Stopwatch

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

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