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

我想在使用此代码打印我的网格单元之前等待一秒钟,但它不起作用。我能做些什么?

4

11 回答 11

229

是否暂停,但您没有看到单元格中出现红色?试试这个:

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
于 2012-05-05T01:52:17.253 回答
42

我个人认为这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();
}
于 2013-12-27T10:30:09.127 回答
29

使用计时器的等待功能,没有 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
于 2018-10-20T13:39:54.030 回答
14

.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);
}
于 2019-11-21T17:23:05.550 回答
5

在不冻结主线程的情况下等待的最佳方法是使用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);             
});
于 2020-08-23T13:55:20.143 回答
3

我觉得这里的所有错误都是顺序,Selçuklu 希望应用程序在填充网格之前等待一秒钟,所以睡眠命令应该在填充命令之前。

    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
于 2019-07-15T21:09:20.890 回答
1

如果时间很短,繁忙的等待不会是一个严重的缺点。在我的例子中,需要通过闪烁控件向用户提供视觉反馈(它是一个可以复制到剪贴板的图表控件,它会在几毫秒内改变其背景)。它以这种方式工作正常:

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;
....
于 2016-06-29T13:46:36.507 回答
0

使用dataGridView1.Refresh();:)

于 2013-04-14T22:50:09.010 回答
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
于 2019-03-03T23:30:51.527 回答
0

这个解决方案很短,据我所知,很简单。

public void safeWait(int milliseconds)
{
    long tickStop = Environment.TickCount + milliseconds;
    while (Environment.TickCount < tickStop)
    {
        Application.DoEvents();
    }
}
于 2022-01-14T10:14:26.080 回答
-4

也许试试这个代码:

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

    while (t < tf) {
        t = DateTime.Now;
    }
}
于 2014-11-13T20:51:42.093 回答