在运行程序中等待一秒钟

Sel*_*rar 82 c# wait

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

我想在使用此代码打印网格单元格之前等待一秒钟,但它无法正常工作.我能做什么?

Mat*_*wdy 147

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

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


Mar*_*owe 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 什么是调度程序定时器?我无法包含在 winform 项目中 (4认同)

小智 12

.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式等待此方法的完成:

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}
Run Code Online (Sandbox Code Playgroud)


Sai*_*aid 11

使用计时器的等待功能,没有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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

用法:将其放在需要等待的代码中:

wait(1000); //wait one second
Run Code Online (Sandbox Code Playgroud)


ami*_*ein 10

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


小智 8

我觉得这里的所有错误都是顺序,Sel\xc3\xa7uklu 希望应用程序在填充网格之前等待一秒钟,因此 Sleep 命令应该在填充命令之前出现。

\n\n
    System.Threading.Thread.Sleep(1000);\n    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;\n
Run Code Online (Sandbox Code Playgroud)\n


小智 7

如果使用异步

await Task.Delay(new TimeSpan(0, 0, 1));
Run Code Online (Sandbox Code Playgroud)

别的

Thread.Sleep(new TimeSpan(0, 0, 1));
Run Code Online (Sandbox Code Playgroud)