You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#.NET如何等待Alert弹窗关闭后再弹出下一个 避免一次性全部显示

实现方案

Thread.Sleep是同步阻塞方法,会直接挂起当前运行的UI线程,导致整个界面无法响应任何操作;而Task.Delay是异步等待,等待期间不会占用UI线程,程序可以正常响应用户其他操作,到设定时间后自动继续执行后续逻辑。

你可以根据自己的业务需求选择以下两种实现方式:


方案1:弹窗自动定时依次弹出(无需用户操作,间隔6秒弹下一个,不卡UI)

核心是用异步等待Task.Delay替代阻塞式的Thread.Sleep:

  • 首先将包含该循环的方法标记为async,如果是普通业务方法返回值改为Task,如果是UI事件处理(比如按钮点击)可以用async void
  • 把原来的Thread.Sleep(6000)替换为await Task.Delay(6000)

修改后代码示例:

// 示例为按钮点击事件,所以用async void
private async void YourTriggerMethod(object sender, EventArgs e)
{
    for (int i = 0; i < dc.person.Count(); i++)
    {
        personActuel = dc.person.Skip(i).Take(1).First();

        if (paid.Find(c => c.nume == personActuel.numE) == null)
        {
            this.Alert("msg" + " " + personActuel.nom + " " + personActuel.prenom + " date :", CulcPay(personActuel.dateAff.Value));
            // 异步等待6秒,不会阻塞UI线程
            await Task.Delay(6000);
        }
    }
}

方案2:用户关闭当前弹窗后才弹出下一个(无需固定定时,由用户操作控制顺序)

如果你的Alert是自定义的窗体类,改成调用ShowDialog()方法弹出模态窗体,模态窗体本身会暂停后续代码执行直到窗体被关闭,且不会卡死整个程序的其他响应:

for (int i = 0; i < dc.person.Count(); i++)
{
    personActuel = dc.person.Skip(i).Take(1).First();

    if (paid.Find(c => c.nume == personActuel.numE) == null)
    {
        // 模态弹出Alert,用户关闭后才会执行后续循环
        new AlertForm("msg" + " " + personActuel.nom + " " + personActuel.prenom + " date :", CulcPay(personActuel.dateAff.Value)).ShowDialog();
    }
}

内容的提问来源于stack exchange,提问作者FLK Coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:36:05