dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
İต้องการรอหนึ่งวินาทีก่อนที่จะพิมพ์เซลล์ตารางของฉันด้วยรหัสนี้ แต่มันไม่ทำงาน ฉันจะทำอะไรได้บ้าง?
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
İต้องการรอหนึ่งวินาทีก่อนที่จะพิมพ์เซลล์ตารางของฉันด้วยรหัสนี้ แต่มันไม่ทำงาน ฉันจะทำอะไรได้บ้าง?
คำตอบ:
กำลังหยุดชั่วคราว แต่คุณไม่เห็นสีแดงของคุณปรากฏในเซลล์หรือไม่ ลองสิ่งนี้:
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
    โดยส่วนตัวแล้วฉันคิดว่าThread.Sleepเป็นการดำเนินการที่ไม่ดี มันล็อก UI ฯลฯ โดยส่วนตัวแล้วฉันชอบการใช้งานตัวจับเวลาเพราะมันรอแล้วก็เริ่มทำงาน
การใช้งาน:     DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));
//Note Forms.Timer and Timer() have similar implementations. 
public static void DelayAction(int millisecond, Action action)
{
    var timer = new DispatcherTimer();
    timer.Tick += delegate
    {
        action.Invoke();
        timer.Stop();
    };
    timer.Interval = TimeSpan.FromMilliseconds(millisecond);
    timer.Start();
}
    ฟังก์ชันรอโดยใช้ตัวจับเวลาไม่มีการล็อก UI
public void wait(int milliseconds)
{
    var timer1 = new System.Windows.Forms.Timer();
    if (milliseconds == 0 || milliseconds < 0) return;
    // Console.WriteLine("start wait timer");
    timer1.Interval = milliseconds;
    timer1.Enabled  = true;
    timer1.Start();
    timer1.Tick += (s, e) =>
    {
        timer1.Enabled = false;
        timer1.Stop();
        // Console.WriteLine("stop wait timer");
    };
    while (timer1.Enabled)
    {
        Application.DoEvents();
    }
}
การใช้งาน: เพียงวางสิ่งนี้ไว้ในโค้ดของคุณที่ต้องรอ:
wait(1000); //wait one second
    .Net Core ดูเหมือนว่าจะไม่มีDispatcherTimer.
หากเราพอใจกับการใช้วิธี async Task.Delayจะตอบสนองความต้องการของเรา นอกจากนี้ยังมีประโยชน์หากคุณต้องการรอในลูปสำหรับเหตุผล จำกัด อัตรา
public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}
คุณสามารถรอให้วิธีนี้เสร็จสิ้นได้ดังนี้:
public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}
    การรอไม่ว่างจะไม่ใช่ข้อเสียเปรียบอย่างรุนแรงหากใช้เวลาสั้น ๆ ในกรณีของฉันมีความจำเป็นที่จะต้องให้ข้อเสนอแนะด้วยภาพแก่ผู้ใช้โดยการกะพริบตัวควบคุม (เป็นตัวควบคุมแผนภูมิที่สามารถคัดลอกไปยังคลิปบอร์ดซึ่งจะเปลี่ยนพื้นหลังเป็นเวลาหลายมิลลิวินาที) มันทำงานได้ดีด้วยวิธีนี้:
using System.Threading;
...
Clipboard.SetImage(bm);   // some code
distribution_chart.BackColor = Color.Gray;
Application.DoEvents();   // ensure repaint, may be not needed
Thread.Sleep(50);
distribution_chart.BackColor = Color.OldLace;
....
    ฉันรู้สึกว่าทั้งหมดนี้ผิดที่นี่คือคำสั่งSelçukluต้องการให้แอปรอสักครู่ก่อนที่จะกรอกข้อมูลในตารางดังนั้นคำสั่ง Sleep ควรมาก่อนคำสั่งเติม
    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    ใช้dataGridView1.Refresh();:)
วิธีที่ดีที่สุดในการรอโดยไม่หยุดเธรดหลักคือการใช้ฟังก์ชันTask.Delay
โค้ดของคุณจะเป็นแบบนี้
var t = Task.Run(async delegate
{              
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    dataGridView1.Refresh();
    await Task.Delay(1000);             
});
    ลองใช้ฟังก์ชันนี้
public void Wait(int time) 
{           
    Thread thread = new Thread(delegate()
    {   
        System.Threading.Thread.Sleep(time);
    });
    thread.Start();
    while (thread.IsAlive)
    Application.DoEvents();
}
ฟังก์ชั่นการโทร
Wait(1000); // Wait for 1000ms = 1s
    อาจลองใช้รหัสนี้:
void wait (double x) {
    DateTime t = DateTime.Now;
    DateTime tf = DateTime.Now.AddSeconds(x);
    while (t < tf) {
        t = DateTime.Now;
    }
}