รอหนึ่งวินาทีในโปรแกรมที่กำลังทำงานอยู่


114
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);

İต้องการรอหนึ่งวินาทีก่อนที่จะพิมพ์เซลล์ตารางของฉันด้วยรหัสนี้ แต่มันไม่ทำงาน ฉันจะทำอะไรได้บ้าง?


1
ควรรันโค้ดอะไรหลังจากรอ 1 วินาที
Allensb

1
คุณจะรู้ได้อย่างไรว่ามันใช้ไม่ได้? ลองนอน 10,000 และดูว่ามันใช้งานได้ไหม 1000 นั้นสั้นมากในการประเมินว่าใช้งานได้หรือไม่
Missy

ใช้งานได้ดี: System.Threading.Thread.Sleep (1000);
Andrew

คำตอบ:


191

กำลังหยุดชั่วคราว แต่คุณไม่เห็นสีแดงของคุณปรากฏในเซลล์หรือไม่ ลองสิ่งนี้:

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);

31

โดยส่วนตัวแล้วฉันคิดว่า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();
}

16

ฟังก์ชันรอโดยใช้ตัวจับเวลาไม่มีการล็อก 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

เพียงข้อเสนอแนะ หากคุณคูณขั้นต่ำด้วย 60000 ชื่อพารามิเตอร์จะมีความหมายมากขึ้น จับเวลา 1. ช่วงเวลา = นาที * 60000;
Golda

ใช่คุณพูดถูกควรเป็นมิลลิวินาทีแทนที่จะเป็นนาที ฉันจะอัปเดตชื่อ ขอบคุณ
กล่าวเมื่อ

4

.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);
}

นั่นเป็นวิธีที่สมบูรณ์แบบ ขอบคุณ! :)
Deniz

2

การรอไม่ว่างจะไม่ใช่ข้อเสียเปรียบอย่างรุนแรงหากใช้เวลาสั้น ๆ ในกรณีของฉันมีความจำเป็นที่จะต้องให้ข้อเสนอแนะด้วยภาพแก่ผู้ใช้โดยการกะพริบตัวควบคุม (เป็นตัวควบคุมแผนภูมิที่สามารถคัดลอกไปยังคลิปบอร์ดซึ่งจะเปลี่ยนพื้นหลังเป็นเวลาหลายมิลลิวินาที) มันทำงานได้ดีด้วยวิธีนี้:

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;
....

2

ฉันรู้สึกว่าทั้งหมดนี้ผิดที่นี่คือคำสั่งSelçukluต้องการให้แอปรอสักครู่ก่อนที่จะกรอกข้อมูลในตารางดังนั้นคำสั่ง Sleep ควรมาก่อนคำสั่งเติม

    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;


1

วิธีที่ดีที่สุดในการรอโดยไม่หยุดเธรดหลักคือการใช้ฟังก์ชัน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);             
});

0

ลองใช้ฟังก์ชันนี้

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

-4

อาจลองใช้รหัสนี้:

void wait (double x) {
    DateTime t = DateTime.Now;
    DateTime tf = DateTime.Now.AddSeconds(x);

    while (t < tf) {
        t = DateTime.Now;
    }
}

5
นี่เป็นวิธีแก้ปัญหาที่ถูกต้อง อย่างไรก็ตามคุณควรเพิ่มคำอธิบายเกี่ยวกับประโยชน์และอันตรายของมันเช่นการระบุว่าเนื่องจากเป็นโซลูชันที่รองานยุ่งจึงต้องใช้เวลา CPU นาน

1
ทางออกที่สั้นกว่าคือทางออกที่ดีกว่า
BASEER ULHASSAN
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.