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
相关产品推荐
相关产品推荐

