在运行程序中等待一秒钟

时间:2012-05-05 01:47:58

标签: c# wait

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

我希望在使用此代码打印网格单元格之前等待一秒钟,但它无法正常工作。我该怎么办?

10 个答案:

答案 0 :(得分:125)

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

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

答案 1 :(得分:26)

我个人认为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();
}

答案 2 :(得分:8)

使用计时器等待功能,没有UI锁定。

public void wait(int milliseconds)
    {
        System.Windows.Forms.Timer 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

答案 3 :(得分: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;
....

答案 4 :(得分:1)

使用dataGridView1.Refresh();:)

答案 5 :(得分: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);             
});

答案 6 :(得分: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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

.Net Core似乎缺少cabal

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

Task.Delay

您可以按照以下步骤等待此方法的完成:

public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}

答案 9 :(得分:-4)

也许试试这段代码:

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

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