Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การตั้งค่า Stopwatch ให้เป็นศูนย์ใน C# ด้วยเมธอด Restart()

เมธอด Restart() ของคลาส Stopwatch (System.Diagnostics) ใช้หยุดนาฬิกา รีเซ็ตเวลาที่ผ่านไปเป็นศูนย์ และเริ่มนับเวลาใหม่ทันที - เทียบเท่ากับการเรียก Stop() ตามด้วย Reset() และ Start()

รูปแบบการใช้งาน

Stopwatch sw = Stopwatch.StartNew();
// ... ทำงานบางอย่าง ...
sw.Restart(); // รีเซ็ตเป็น 0 และเริ่มนับใหม่ทันที

โค้ดตัวอย่างสมบูรณ์

using System;
using System.Threading;
using System.Diagnostics;

public class Demo
{
    public static void Main()
    {
        Stopwatch sw = Stopwatch.StartNew();
        
        Console.WriteLine("เริ่มจับเวลา...");
        Thread.Sleep(500); // จำลองงาน 500 ms
        
        Console.WriteLine($"ก่อน Restart: {sw.ElapsedMilliseconds} ms");
        
        // รีเซ็ตเป็นศูนย์และเริ่มนับใหม่
        sw.Restart();
        
        Console.WriteLine("หลัง Restart - เริ่มนับใหม่...");
        Thread.Sleep(500); // จำลองงานอีก 500 ms
        
        Console.WriteLine($"หลังทำงานครั้งที่ 2: {sw.ElapsedMilliseconds} ms");
        Console.WriteLine($"เวลาทั้งหมด (Elapsed): {sw.Elapsed}");
        
        // แสดงความแตกต่างระหว่าง Restart และ Reset
        Console.WriteLine("\n--- เปรียบเทียบ Restart vs Reset ---");
        Stopwatch sw2 = Stopwatch.StartNew();
        Thread.Sleep(200);
        Console.WriteLine($"ก่อน Reset: {sw2.ElapsedMilliseconds} ms");
        
        sw2.Reset(); // หยุดและรีเซ็ต แต่ไม่เริ่มนับใหม่
        Console.WriteLine($"หลัง Reset: {sw2.ElapsedMilliseconds} ms (หยุดนับ)");
        
        sw2.Start(); // ต้องเรียก Start() เอง
        Thread.Sleep(200);
        Console.WriteLine($"หลัง Start ใหม่: {sw2.ElapsedMilliseconds} ms");
    }
}

ผลลัพธ์

เริ่มจับเวลา...
ก่อน Restart: 500 ms
หลัง Restart - เริ่มนับใหม่...
หลังทำงานครั้งที่ 2: 500 ms
เวลาทั้งหมด (Elapsed): 00:00:01.0001234

--- เปรียบเทียบ Restart vs Reset ---
ก่อน Reset: 200 ms
หลัง Reset: 0 ms (หยุดนับ)
หลัง Start ใหม่: 200 ms

Restart() vs Reset() vs Stop()

เมธอดหยุดนับรีเซ็ตเป็น 0เริ่มนับใหม่
Restart()✓✓✓ (ทันที)
Reset()✓✓✗ (ต้องเรียก Start() เอง)
Stop()✓✗✗ (ต้องเรียก Start() เอง)

กรณีการใช้งานทั่วไป

// 1. จับเวลาหลายรอบ (Lap timing)
Stopwatch sw = Stopwatch.StartNew();
for (int i = 1; i <= 3; i++)
{
    DoWork();
    Console.WriteLine($"รอบ {i}: {sw.ElapsedMilliseconds} ms");
    sw.Restart(); // เริ่มจับรอบใหม่
}

// 2. วัดเวลาที่แยกต่างหาก (ไม่ต้องการรวมเวลารอ)
Stopwatch sw = Stopwatch.StartNew();
DoWork();
sw.Stop(); // หยุดขณะรอ Input
WaitForUserInput();
sw.Start(); // เริ่มนับต่อ (สะสมเวลา)
// หรือใช้ Restart() หากต้องการเริ่มนับใหม่จากศูนย์

ข้อควรระวัง

  • Restart() เหมาะสำหรับการจับเวลาแบบ "Lap" หรือเริ่มวัดใหม่จากศูนย์
  • หากต้องการสะสมเวลา (Pause/Resume) ให้ใช้ Stop() และ Start() แทน
  • Elapsed คืนค่า TimeSpan ใช้ ElapsedMilliseconds หรือ ElapsedTicks สำหรับค่าตัวเลข
  • Stopwatch ใช้ High-Resolution Timer (QueryPerformanceCounter บน Windows) - แม่นยำกว่า DateTime