Время работы измерительной нити - PullRequest
0 голосов
/ 09 января 2012
public void Foo(IRB inR) {
    Stopwatch sw = new Stopwatch();
    sw.Start();

    System.Threading.Thread theThread = new System.Threading.Thread(delegate() {
            if (inR.Ready) {
                inR.ABC();
                while (!inR.Ready) { Thread.Sleep(100); }
            }
            mP.CP = false;
        });
    theThread.Name = "aaabbbccc";
    theThread.Start();
}

Итак, я хочу использовать StopWatch для измерения времени, в течение которого работает "theThread".(На самом деле, я хочу измерить время от создания этого потока до конца потока.) Я уже положил stopwatch.start (), где я хочу.Но где я должен положить свой секундомер.stop ()?Спасибо.

Ответы [ 2 ]

7 голосов
/ 09 января 2012

Почему бы не поместить код секундомера в сам поток? Например:

public class ThreadTimer
{
    private readonly ThreadStart realWork;

    public ThreadTimer(ThreadStart realWork)
    {
        this.realWork = realWork;
    }

    public void TimeAndExecute()
    {
        Stopwatch stopwatch = Stopwatch.StartNew();
        try
        {
            realWork();
        }
        finally
        {
            stopwatch.Stop();
            // Log or whatever here
        }
    }
}

Тогда:

ThreadStart work = delegate() {
    if (inR.Ready) {
        inR.ABC();
        while (!inR.Ready) { Thread.Sleep(100); }
    }
    mP.CP = false;
};
ThreadTimer timer = new ThreadTimer(work);
Thread thread = new Thread(timer.TimeAndExecute);
thread.Start();
1 голос
/ 09 января 2012

Можете ли вы поставить его в конце вашего делегата?
Вам придется объединить фоновый поток с работающим потоком, если вы создадите объект Stopwatch как переменную, локальную для вашей функции. Или вы можете создать его вне функции, чтобы позволить потоку работать без присоединения.

public void ConditionPlate(IRB inR)
{

    Stopwatch sw = new Stopwatch();
    sw.Start();

    System.Threading.Thread theThread = new System.Threading.Thread(delegate()
    {
        if (inR.Ready)
        {
            inR.ABC();
            while (!inR.Ready) { Thread.Sleep(100); }
        }
        mP.CP = false;

        // ********************************
        // This will stop the stopwatch.
        // ********************************
        sw.Stop();
    });
    theThread.Name = "aaabbbccc";
    theThread.Start();

    // Wait for the thread to stop (necessary if 'sw' is created here, locally)
    theThread.Join();

    // gets time required for creation of thread to thread completion.
    var elapsed = sw.Elapsed;

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