解决方案 »

  1.   

    我也试过如下的方法,在页面中加入:
    <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分钟)。还请高手指点,如何解决该问题?
      

  2.   

    请问是不是要用ajax的异步处理? 如果是的话,如何设置进度条窗口(客户端)和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" />
      

  4.   

    我搜索到这篇文章《使用 Async 和 Await 的异步编程》http://msdn.microsoft.com/zh-cn/library/hh191443(v=vs.110).aspx好像visual studio2012可以实现异步编程。有没有试过用Async 和 Await 进行过异步编程的高手,请指点一下我,谢谢!
      

  5.   

    可能是因为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);
    这种简单处理就行了
      

  6.   

    谢谢楼上的答复,我试验过,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();
                           
            }
      

  7.   

    回楼上的,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
      

  8.   

    你按钮点击,执行服务器端方法,怎么可能是异步的用ajax异步调用执行后台方法,前台在点击的时候就弹出进度条窗口
    如果要求精确的进度,后台方法执行的时候回发进度数值给前台显示
      

  9.   


        我进行过debug, 这行语句没有被执行:
    Response.Write("<script>alert(ssis package has been executed')</script>"); 
      

  10.   


    谢谢楼上的指点,请问该如何用ajax异步调用执行后台方法?等待您的指导,感谢感谢!
      

  11.   

    我也是网上随便搜,你看看
    JQuery+ajax