我有两个辅助线程,它们执行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()方法?
答案 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)
将WriteX()
包裹在保存前后当前时间的内容中(或者只是在WriteX()
的开头和结尾处执行)并在结尾处打印差异。
当传递给ThreadStart
的方法结束时,线程自行终止(并自行清理)
再次,将WriteX()
包装在执行日志记录的内容中。我建议查看ThreadStart
的来源,看看它是如何实现的,以及如何扩展/包装它。
如果您不知道我在说什么,this article可能有帮助。
答案 2 :(得分:0)
这取决于您是否想要获得两个独立任务或最大任务的执行时间总和。在第一种情况下,您需要在WriteX中测量所需的时间。在startOne之前的第二种情况下,当两者完成时停止测量。在这两种情况下都使用Stopwatch
。
使用Thread.Join
等待两个线程完成。
使用参数化的开始Thread.Start(object)
并在那里传递任务名称。