c# - 线程——执行时间的模拟

标签 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 ) 我启动了线程 (Start() )。我是否需要在成功执行后停止线程,或者由主线程处理(在本例中为 Main())?

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

最佳答案

在每个严肃的日志记录框架中,您都可以在输出消息中包含线程 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 方法。

关于c# - 线程——执行时间的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1542545/

相关文章:

c# - 将 bytes[] 转换为文字字符串

c# - 在面板上动态创建按钮

GUI期间后台JAVA算法

c# - WPF 将文本从一个窗口传递到另一个窗口

c# - 多次SQL查询或在列表中获取所有一次并在循环中处理会更快

c++ - 如何更改在不同线程中打开的表单的标签文本?

c# - ManualResetEvent 的可能竞争条件

Matlab 对于类型 'C' 的输入参数未定义函数或方法 'double'

c++ - 盒子(3D 空间)中的质点模拟

c++ - 在 C++11 中模拟类似 Arduino 的中断