Threads - моделирование времени выполнения - PullRequest
2 голосов
/ 09 октября 2009

У меня есть два вторичных потока, которые выполняют метод 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 ()?

Ответы [ 3 ]

1 голос
/ 09 октября 2009

В любой серьезной структуре ведения журналов вы можете включить идентификатор потока или имя потока в выходное сообщение. Если вы просто хотите использовать консоль, вам, возможно, придется вручную добавить идентификатор / имя текущего потока в ваше сообщение.

Вроде так:

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, если хотите дождаться окончания потока в главном.

0 голосов
/ 09 октября 2009
  1. Это зависит от того, хотите ли вы получить сумму времени выполнения двух независимых задач или самую большую. В первом случае вам нужно измерить необходимое время в WriteX. Во втором случае перед startOne и прекратите измерение, когда оба будут закончены. Используйте Stopwatch в обоих случаях.

  2. Используйте Thread.Join, чтобы дождаться завершения обоих потоков.

  3. Используйте параметризованный запуск Thread.Start(object) и передайте имя задачи туда.

0 голосов
/ 09 октября 2009
  1. Оберните WriteX() во что-то, что сохраняет текущее время до и после (или просто делает это в начале и конце WriteX()) и печатает разницу в конце.

  2. Когда метод, переданный в ThreadStart, завершается, поток завершает себя (и очищает себя)

  3. Опять заверните WriteX() во что-то, что делает запись в журнал. Я предлагаю посмотреть на источник для ThreadStart, чтобы увидеть, как он реализован и как вы можете расширить / обернуть его.

Если вы не понимаете, о чем я, эта статья может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...