C#服务端导出Excel/PDF完成后如何自动关闭等待窗口
解决方案
你当前的代码逻辑顺序完全倒置:
WaitWindow.Show()方法会阻塞主线程,直到传入的WorkerMethod执行完成后才会返回、关闭等待框。你之前把导出逻辑放在WaitWindow.Show()之后,所以只会先跑完1-100的假计数,关闭等待框后才开始实际导出,完全达不到预期效果。
步骤1:修改export_click方法
把导出需要的参数直接传入WaitWindow.Show(),不需要在外部执行导出逻辑:
protected void export_click(object sender, EventArgs e) { string exportType = hidExportType.Value; string exportSections = hidSections.Value; string exportStudents = hidStudents.Value; // 传入导出参数,等待框会持续到WorkerMethod执行完成自动关闭 WaitWindow.Show(this.WorkerMethod, "正在准备导出文件,请稍候...", exportType, exportSections, exportStudents); }
步骤2:重写WorkerMethod方法
删除原有假计数逻辑,把实际导出逻辑移到这个方法内:
private void WorkerMethod(object sender, Jacksonsoft.WaitWindowEventArgs e) { // 取出传入的三个导出参数 string exportType = e.Arguments[0].ToString(); string exportSections = e.Arguments[1].ToString(); string exportStudents = e.Arguments[2].ToString(); // 执行实际导出逻辑,执行完成后等待框会自动关闭 switch (exportType) { case "csv": export_csv(exportSections, exportStudents); break; case "excel": export_excel(exportSections, exportStudents); break; case "pdf": export_pdf(exportSections, exportStudents); break; default: break; } // 可自定义返回结果,不需要可以删除 e.Result = "导出完成"; }
可选优化:实时更新提示信息
如果你的导出逻辑可以拆分为多个步骤,可以在执行过程中更新等待框的提示文本,提升用户体验:
private void WorkerMethod(object sender, Jacksonsoft.WaitWindowEventArgs e) { string exportType = e.Arguments[0].ToString(); string exportSections = e.Arguments[1].ToString(); string exportStudents = e.Arguments[2].ToString(); e.Window.Message = "正在查询导出数据..."; // 这里放你的数据查询逻辑 e.Window.Message = $"正在生成{exportType}格式文件..."; // 这里放你的文件生成逻辑 e.Window.Message = "正在准备下载..."; // 这里放文件输出逻辑 e.Result = "导出完成"; }
注意事项
- 如果你是WinForm/WPF桌面项目,以上修改可以直接生效。如果导出逻辑中有操作UI控件的代码,需要用
Invoke方法切回UI线程执行,避免跨线程操作报错。 - 如果你是ASP.NET Web项目,这个
Jacksonsoft.WaitWindow是WinForm专属组件,不能在Web场景使用。Web端的等待提示需要用前端实现:点击导出按钮时用JS弹出全局遮罩提示,后端导出完成返回文件后再用JS关闭遮罩即可。
内容的提问来源于stack exchange,提问作者JimmyG
相关产品推荐
相关产品推荐

