项目中遇到这样一个问题:
客户上传完文件后,我需要接着执行一个动作,这个动作可能执行的时间很长很长,那么客户端在这个执行过程中一直是处于页面正在刷新的状态(很可能超时)。
请问高手,有没有一种方法,让这个动作仅在服务器端执行,客户端不察觉?

解决方案 »

  1.   

    你可以考虑使用两种技术中的其中一种
    一是 C#后台的多线程技术
    二是 Ajax技术第一种线程技术的例子:
    前台:
    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="测试多线程控制.WebForm1" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    <HEAD>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">

    <FONT face="宋体">
    <asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 328px; POSITION: absolute; TOP: 64px" runat="server"
    Text="测试"></asp:Button>
    <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 128px; POSITION: absolute; TOP: 72px" runat="server">Label</asp:Label></FONT>
    </form>
    </body>
    </HTML>后台:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Threading;
    using Microsoft.ApplicationBlocks.Data;namespace 测试多线程控制
    {
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button Button1;
    Thread t1;
    Thread t2;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Button1.Click += new System.EventHandler(this.Button1_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void Button1_Click(object sender, System.EventArgs e)
    {   
    t1=new Thread(new ThreadStart(Search));
    t2=new Thread(new ThreadStart(ShowAndHidden));
    Response.Write("<table id=table1 width=300 height=200 bgcolor=yellow align=center border=2><tr><td id=td1 width=80% bgcolor=red>测试调用</td></tr></table>");
    t1.Start();
    t2.Start();
    t2.Join();
    } public void Search()
    {
    SqlConnection myConnection=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectString"].ToString());
        DataSet ds=new DataSet();
    ds=SqlHelper.ExecuteDataset(myConnection,CommandType.StoredProcedure,"ArticleGetPop");
    string arg=ds.Tables[0].Rows[0][0].ToString();
    Response.Write(arg);
    } public void ShowAndHidden()
    {
    t1.Join();
    Response.Write("<script>document.getElementById('td1').style.cssText='display :none;';</script>");
    } }
    }第二种Ajax技术网上就很多雷同的例子了,你可以找找你认为跟你需求相近的改改!