在运行程序中等待一秒钟


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

İ想等一秒钟,然后用此代码打印我的网格单元,但是它不起作用。我能做什么?


1
1秒等待后应该运行什么代码?
2012年

1
您怎么知道它不起作用?尝试睡眠10000,看看是否正常。1000很短,无法评估它是否有效。
小姐

这可以正常工作:System.Threading.Thread.Sleep(1000);
安德鲁

Answers:


178

暂停了吗,但是您看不到单元格中出现红色?试试这个:

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

28

我个人认为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,则参数名称将更有意义。timer1.Interval = min * 60000;
Golda

是的,您说对了,应该是毫秒而不是分钟。我将更新名称。谢谢
赛义德

3

我觉得这里的所有错误就是命令,Selçuklu希望应用程序在填充网格之前等待一秒钟,因此,Sleep命令应该早于fill命令。

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

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

.Net Core似乎丢失了 DispatcherTimer

如果我们可以使用异步方法,Task.Delay则可以满足我们的需求。如果您出于速率限制的原因要在for循环内等待,这也很有用。

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


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

0

等待而不冻结主线程的最佳方法是使用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);             
});

-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.