如何实现单击按钮后弹出进度条页面,同时执行后台的bat文件 asp.net c# 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也试过如下的方法,在页面中加入:<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分钟)。还请高手指点,如何解决该问题? 请问是不是要用ajax的异步处理? 如果是的话,如何设置进度条窗口(客户端)和bat文件执行(服务器端)的异步处理。还请高手给出解决方案,最后有代码示例,感谢感谢! 这是必然的,你可以这么试试<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" /> 我搜索到这篇文章《使用 Async 和 Await 的异步编程》http://msdn.microsoft.com/zh-cn/library/hh191443(v=vs.110).aspx好像visual studio2012可以实现异步编程。有没有试过用Async 和 Await 进行过异步编程的高手,请指点一下我,谢谢! 可能是因为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);这种简单处理就行了 谢谢楼上的答复,我试验过,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(); } 回楼上的,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 你按钮点击,执行服务器端方法,怎么可能是异步的用ajax异步调用执行后台方法,前台在点击的时候就弹出进度条窗口如果要求精确的进度,后台方法执行的时候回发进度数值给前台显示 我进行过debug, 这行语句没有被执行:Response.Write("<script>alert(ssis package has been executed')</script>"); 谢谢楼上的指点,请问该如何用ajax异步调用执行后台方法?等待您的指导,感谢感谢! 我也是网上随便搜,你看看JQuery+ajax GridView每新增一行dropdownlit的绑的值就不包含上面的值该怎么解决 net中如何使用第三方如QQ,新浪微博登录自己的网站? 新手小问题求助 求时间日期显示时间显示星期显示c#代码 上传文件,获取绝对路径失败,大家帮忙解决下。。 怎么触发gridview 的SelectedIndexChanged事件? 怎么把用户控件做成DLL? dal层的接口应该怎么写? 有关DataList的问题 C#作为ASP.Net后端时的变量生存周期问题 求asp.net项目 日期控件为什么点了后变大变小啊
<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分钟)。还请高手指点,如何解决该问题?
还请高手给出解决方案,最后有代码示例,感谢感谢!
<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" />
3#那样应该就可以了,服务端也可以异步启动bat的
http://www.cnblogs.com/fish-li/archive/2011/11/20/2256385.html
你用
public void AddOnPreRenderCompleteAsync(BeginEventHandler beginHandler, EndEventHandler endHandler, object state);
这种简单处理就行了
的例子修改了程序,还是不成功,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();
}
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
如果要求精确的进度,后台方法执行的时候回发进度数值给前台显示
我进行过debug, 这行语句没有被执行:
Response.Write("<script>alert(ssis package has been executed')</script>");
谢谢楼上的指点,请问该如何用ajax异步调用执行后台方法?等待您的指导,感谢感谢!
JQuery+ajax