如何实现单击按钮后弹出进度条页面,同时执行后台的bat文件

wangdaoyuan 2014-04-18 05:27:47
请各位高手指点,如何使用asp.net实现单击按钮后弹出进度条的页面,同时执行后台的bat文件。

我使用c#书写了如下的代码:
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write("<script language=javascript>window.showModelessDialog('Demo.aspx','scroll:1;status:1;help:0;resizable:1;dialogWidth:240px;dialogHeight:240px')</script>");


System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.CreateNoWindow = false;//设置为false将会看到程序窗口
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;//启动进程时窗口状态
p.StartInfo.FileName = @"A.bat";

p.Start();
p.WaitForExit();
p.Close();
}

结果发现服务器端的bat文件先执行(执行约3分钟),之后才出现进度条窗口。

...全文
1053 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdaoyuan 2014-05-08
  • 打赏
  • 举报
回复
我最终没能结局这个问题,不过感谢各位的指点,在此结贴!
Justin-Liu 2014-04-22
  • 打赏
  • 举报
回复
我也是网上随便搜,你看看 JQuery+ajax
wangdaoyuan 2014-04-22
  • 打赏
  • 举报
回复
引用 9 楼 FoxDave 的回复:
你按钮点击,执行服务器端方法,怎么可能是异步的 用ajax异步调用执行后台方法,前台在点击的时候就弹出进度条窗口 如果要求精确的进度,后台方法执行的时候回发进度数值给前台显示
谢谢楼上的指点,请问该如何用ajax异步调用执行后台方法?等待您的指导,感谢感谢!
wangdaoyuan 2014-04-22
  • 打赏
  • 举报
回复
引用 6 楼 wangdaoyuan 的回复:
谢谢楼上的答复,我试验过,OnClientClick事件执行完才执行OnClick的。 我按照《使用 Async 和 Await 的异步编程》http://msdn.microsoft.com/zh-cn/library/hh191443(v=vs.110).aspx 的例子修改了程序,还是不成功,bat文件被执行了,但是Demo.aspx页面没有被显示,还请高手指点 protected async void Button1_Click(object sender, EventArgs e) { int contentLength = await AccessTheWebAsync(); Response.Write("<script>alert(ssis package has been executed')</script>"); } async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); Task<string> getStringTask = client.GetStringAsync("http://localhost:4375/Demo.aspx"); DoIndependentWork(); string urlContents = await getStringTask; return urlContents.Length; } void DoIndependentWork() { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.UseShellExecute = true; p.StartInfo.CreateNoWindow = true;//设置为false将会看到程序窗口 p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//启动进程时窗口状态 p.StartInfo.FileName = @"E:\invokebatfile.bat"; p.StartInfo.WorkingDirectory = @"E:\"; p.Start(); p.WaitForExit(); p.Close(); }
我进行过debug, 这行语句没有被执行: Response.Write("<script>alert(ssis package has been executed')</script>");
Justin-Liu 2014-04-22
  • 打赏
  • 举报
回复
你按钮点击,执行服务器端方法,怎么可能是异步的 用ajax异步调用执行后台方法,前台在点击的时候就弹出进度条窗口 如果要求精确的进度,后台方法执行的时候回发进度数值给前台显示
wangdaoyuan 2014-04-22
  • 打赏
  • 举报
回复
回楼上的,Demo.aspx就是打开的页面,Demo.aspx的page_load事件内有绘制进度条的程序。 具体代码如下: public partial class Demo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { beginProgress(); finishProgress(); } #region 进度条方法 private void beginProgress() { //根据ProgressBar.htm显示进度条界面 string templateFileName = Path.Combine(Server.MapPath("."), "ProgressBar.htm"); StreamReader reader = new StreamReader(@templateFileName, System.Text.Encoding.GetEncoding("GB2312")); string html = reader.ReadToEnd(); reader.Close(); Response.Write(html); Response.Flush(); Thread thread = new Thread(new ThreadStart(ThreadProc)); thread.Start(); LoadData();//load数据 thread.Join(); } private void setProgress(int percent) { Thread.Sleep(1000); int rightpercent = (int)(percent/(100/100)); string jsBlock = "<script>SetPorgressBar('" + rightpercent.ToString() + "'); </script>"; Response.Write(jsBlock); Response.Flush(); } private void finishProgress() { string jsBlock = "<script>SetCompleted();</script>"; Response.Write(jsBlock); Response.Flush(); Response.Clear(); } private void exception() { string jsBlock = "<script>exception();</script>"; Response.Write(jsBlock); Response.Flush(); Response.Clear(); } #endregion #region ThreadProc private void ThreadProc() { for (int i = 1; i <= 100; i++) { setProgress(i); } } #endregion
紫魂一号 2014-04-22
  • 打赏
  • 举报
回复
你的进度条不会写到打开的页面当中么?
wangdaoyuan 2014-04-22
  • 打赏
  • 举报
回复
谢谢楼上的答复,我试验过,OnClientClick事件执行完才执行OnClick的。 我按照《使用 Async 和 Await 的异步编程》http://msdn.microsoft.com/zh-cn/library/hh191443(v=vs.110).aspx 的例子修改了程序,还是不成功,bat文件被执行了,但是Demo.aspx页面没有被显示,还请高手指点 protected async void Button1_Click(object sender, EventArgs e) { int contentLength = await AccessTheWebAsync(); Response.Write("<script>alert(ssis package has been executed')</script>"); } async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); Task<string> getStringTask = client.GetStringAsync("http://localhost:4375/Demo.aspx"); DoIndependentWork(); string urlContents = await getStringTask; return urlContents.Length; } void DoIndependentWork() { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.UseShellExecute = true; p.StartInfo.CreateNoWindow = true;//设置为false将会看到程序窗口 p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//启动进程时窗口状态 p.StartInfo.FileName = @"E:\invokebatfile.bat"; p.StartInfo.WorkingDirectory = @"E:\"; p.Start(); p.WaitForExit(); p.Close(); }
  • 打赏
  • 举报
回复
可能是因为window.showModelessDialog是模态的吧 3#那样应该就可以了,服务端也可以异步启动bat的 http://www.cnblogs.com/fish-li/archive/2011/11/20/2256385.html 你用 public void AddOnPreRenderCompleteAsync(BeginEventHandler beginHandler, EndEventHandler endHandler, object state); 这种简单处理就行了
wangdaoyuan 2014-04-22
  • 打赏
  • 举报
回复
我搜索到这篇文章《使用 Async 和 Await 的异步编程》http://msdn.microsoft.com/zh-cn/library/hh191443(v=vs.110).aspx 好像visual studio2012可以实现异步编程。 有没有试过用Async 和 Await 进行过异步编程的高手,请指点一下我,谢谢!
md5e 2014-04-18
  • 打赏
  • 举报
回复
这是必然的,你可以这么试试 <script type="text/javascript" language="javascript"> <!-- function openChild() { setTimeout(function () {window.showModelessDialog("Demo.aspx", window, "dialogWidth:335px;status:no;dialogHeight:300px");}, 100); return true; } //--> </script> <asp:Button ID="Button1" runat="server" OnClientClick="return openChild();" OnClick="Button1_Click" Text="invoke ssis package" />
wangdaoyuan 2014-04-18
  • 打赏
  • 举报
回复
请问是不是要用ajax的异步处理? 如果是的话,如何设置进度条窗口(客户端)和bat文件执行(服务器端)的异步处理。 还请高手给出解决方案,最后有代码示例,感谢感谢!
wangdaoyuan 2014-04-18
  • 打赏
  • 举报
回复
我也试过如下的方法,在页面中加入: <script type="text/javascript" language="javascript"> <!-- function openChild() { window.showModelessDialog("Demo.aspx", window, "dialogWidth:335px;status:no;dialogHeight:300px"); } //--> </script> <asp:Button ID="Button1" runat="server" OnClientClick="openChild();return true;" OnClick="Button1_Click" Text="invoke ssis package" /> 结果发现OnClientClick事件的执行完了之后才执行OnClick事件。 显示的结果就是进度条窗口先执行3分钟,之后才执行bat文件(3分钟)。 还请高手指点,如何解决该问题?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧