2015-04-07 5 views
0

Таймер, на мой взгляд, не очень точен, когда он отображает время с его _Tick() Метод. Я хочу показать истекшее время в минутах/секундах, показывая, сколько времени требуется для завершения процедуры. Я использовал это с таймером, но обнаружил, что его вычисления неверны. Вот почему я хотел спросить, будет ли StopWatch лучше показывать более точно или это отдельный элемент управления, который я должен использовать в целом?StopWatch Or Timer

private int timepassed = 0; 
private void buttonFourteen_Click(object sender, DragEventArgs e) 
{ 
    timer2.Start(); 
    var backgroundWorker = new BackgroundWorker(); 
    backgroundWorker.DoWork += (s, e) => 
    { 
    //Lengthy Procedure Goes Here 
    }; 
    backgroundWorker.RunWorkerCompleted += (s, e) => 
    { 
    timer2.Stop(); 
    }; 
    backgroundWorker.RunWorkerAsync(); 
} 
private void timer2_Tick(object sender, EventArgs e) 
{ 
    timepassed++; 
    timedisplay.Text = timepassed.ToString(); 
} 
+3

'показать отрезок времени процедура занимает до complete' вы хотите секундомера. Таймер предназначен для выполнения действия с установленными интервалами. – Jonesopolis

+1

Используйте соответствующий инструмент для того, что вы хотите сделать. «Секундомер» используется для измерения прошедшего времени. «Таймер» используется для планирования. По крайней мере, вы не используете 'DateTime' для измерения, поскольку это также не предназначено для точных интервальных измерений. –

+0

Я бы использовал таймер и сохранил время начала, чтобы вычислить разницу во времени на 'Now-Start'. Секундомер необходим для точности, когда производительность TESTING, а не отображение таймера с точностью до 2-х тактовых точек в лучшем случае. – SimpleVar

ответ

2

Вот один из способов сделать это с секундомером, который должен быть очень точным:

private readonly Stopwatch sw = new Stopwatch(); 
private readonly System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 

public Form1() 
{ 
    InitializeComponent(); 
    timer.Tick += timer2_Tick; 
} 

private void buttonFourteen_Click(object sender, EventArgs e) 
{ 
    sw.Restart(); 
    timer.Start(); 
    var backgroundWorker = new BackgroundWorker(); 

    // Simulating a 10-second process for testing 
    backgroundWorker.DoWork += (s, ea) => Thread.Sleep(TimeSpan.FromSeconds(10)); 

    backgroundWorker.RunWorkerCompleted += (s, ea) => timer.Stop(); 
    backgroundWorker.RunWorkerAsync(); 
} 

private void timer2_Tick(object sender, EventArgs e) 
{ 
    timedisplay.Text = sw.Elapsed.ToString("g"); 

    // Or use a custom time format (you can specify precision as well as 
    // delimiters between days, hours, minutes, seconds, and milliseconds): 
    // timedisplay.Text = sw.Elapsed.ToString(@"dd\.hh\:mm\:ss\.ff"); 
} 
+0

Я получаю ошибку компиляции «Таймер», является неоднозначной между «System.Windows.Forms». Timer 'и' System.Threading.Timer ' –

+1

Я использовал Windows.Forms ... Я обновляю образец с явным типом. –

2

System.Diagnostics.StopWatch типичный метод для отслеживания такого рода вещи. Если вы используете VS и просто пытаетесь выполнить проверки производительности, вы также можете профилировать код, а также дать вам представление о том, сколько времени потрачено на каждый метод.

+0

Да, я использую VS2010 - Как бы я профилировал код? –

+1

По сути, вы запускаете свое приложение, приближаете его к состоянию, которое попадет в обработанный код, затем в VS перейдите к разделу «Анализ», «Профилировщик», «Прикрепить/Отсоединить». См. Справочный материал новичка на профилировщике VS здесь: https://msdn.microsoft.com/en-us/library/ms182372.aspx – Travis