`
阿尔萨斯
  • 浏览: 4147618 次
社区版块
存档分类
最新评论

ASP.net 页面被关闭后,服务器端是否仍然执行中?

 
阅读更多

问题:当一个正在执行中的ASPX页面执行到一半的时候,浏览器中你关闭了这个页面,服务器端对应的这个页面的代码仍然在执行么?

答案:除非你代码里面做了特殊判断,否则仍然正在执行。

注意点:

1、客户端显示页面的时候,后台已经执行完了的页面对象早已经不存在了。当然这时候谈不上服务器段执行不执行的问题了。

2、页面还没有返回,处于等待状态的时候。关闭ASPX页面,才会涉及到上面提到的服务器端仍然在执行的情况。

3、客户端关闭的时候根本不向服务器发送指令。

4、除非你代码里面做了特殊判断,这里的特殊判断指用 if(!Response.IsClientConnected) 来检测状态而用代码终止运行。

下面的简单代码就是演示关闭页面后,看是否仍然在执行?

你可以在这个页面打开后, 还没有返回任何信息的时候把这个页面关闭,然后看指定目录下是否有对应文件被创建并填写内容。

        protected void Page_Load(object sender, EventArgs e)
{
StringBuilder txt = new StringBuilder();

txt.AppendLine();
txt.AppendLine(DateTime.Now.ToString("u"));
txt.AppendLine("asvd");

Response.Write(DateTime.Now.ToString("u"));
Response.Write("
/r/n
");
Thread.Sleep(50000);


txt.AppendLine(DateTime.Now.ToString("u"));
Response.Write(DateTime.Now.ToString("u"));
Response.Write("
/r/n
");

// 把一些信息写到另外一个文件,借此察看是否正在运行
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
DateTime dt = DateTime.Now;
string shortfileName = string.Format("errors_{0:0000}{1:00}{2:00}.log", dt.Year, dt.Month, dt.Day);
string fileName = Path.Combine(dir, shortfileName);

StreamWriter sw;
if (File.Exists(fileName))
sw = File.AppendText(fileName);
else
sw = File.CreateText(fileName);

sw.Write(txt.ToString());
sw.Close();
sw = null;

}

作了特殊判断的情况简单例子:

注意: IsClientConnected 的判断在 VS.net 开发工具自带的开发站点 ASP.NET Development Server 是不支持的。 ASP.NET Development Server 永远返回 true 。

IIS 才是支持的。

        protected void Page_Load(object sender, EventArgs e)
{

StringBuilder txt = new StringBuilder();

for (int i = 0; i < 100; i++)
{
if (this.Response.IsClientConnected)
{
txt.AppendLine();
txt.AppendLine(DateTime.Now.ToString("u"));
txt.AppendLine(i.ToString());

Response.Write(DateTime.Now.ToString("u"));
Response.Write("
/r/n
");
Thread.Sleep(500);
}
else
{
Response.End();
return;
}
}

txt.AppendLine(DateTime.Now.ToString("u"));
Response.Write(DateTime.Now.ToString("u"));
Response.Write("
/r/n
");

// 把一些信息写到另外一个文件,借此察看是否正在运行
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
DateTime dt = DateTime.Now;
string shortfileName = string.Format("errors_{0:0000}{1:00}{2:00}.log", dt.Year, dt.Month, dt.Day);
string fileName = Path.Combine(dir, shortfileName);

StreamWriter sw;
if (File.Exists(fileName))
sw = File.AppendText(fileName);
else
sw = File.CreateText(fileName);

sw.Write(txt.ToString());
sw.Close();
sw = null;
}

这个例子中是发现中断,就抛弃之前做的任何东西。

当然我们也可以简单的修改上述代码,让把已经处理完成的东西记录下来,类似下面的代码

        protected void Page_Load(object sender, EventArgs e)
{
StringBuilder txt = new StringBuilder();

for (int i = 0; i < 100; i++)
{
if (this.Response.IsClientConnected)
{
txt.AppendLine();
txt.AppendLine(DateTime.Now.ToString("u"));
txt.Append("********** ");
txt.AppendLine(i.ToString());

Response.Write(DateTime.Now.ToString("u"));
Response.Write("
/r/n
");
Thread.Sleep(500);
}
else
{
break;
}
}

txt.AppendLine(DateTime.Now.ToString("u"));
Response.Write(DateTime.Now.ToString("u"));
Response.Write("
/r/n
");

// 把一些信息写到另外一个文件,借此察看是否正在运行
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
DateTime dt = DateTime.Now;
string shortfileName = string.Format("errors_{0:0000}{1:00}{2:00}.log", dt.Year, dt.Month, dt.Day);
string fileName = Path.Combine(dir, shortfileName);

StreamWriter sw;
if (File.Exists(fileName))
sw = File.AppendText(fileName);
else
sw = File.CreateText(fileName);

sw.Write(txt.ToString());
sw.Close();
sw = null;
}

需要注意的是, 使用 isClientConnected 是要占用一定的系统资源的。

isClientConnected 实际上需要向客户端输出一点东西,然后才知道客户端是否仍然在线。

这样,除非你的应用非常耗时,否则建议你不要用 isClientConnected 。 免得判断 isClientConnected 使用的资源比你实际业务逻辑使用的资源还要多。

在任何情况下, Response.IsClientConnected 都要有些开销,所以,只有在执行至少要用 500 毫秒(如果想维持每秒几十页的吞吐量,这是一个很长的时间了)的操作前才使用它。作为通常的规则,不要在紧密循环的每次迭代中调用它,例如当绘制表中的 行,可能每 20 行或每 50 行调用一次。

参考资料:

how to increase timeout on aspx page?
http://p2p.wrox.com/topic.asp?TOPIC_ID=7504

asp.net能不能在客户端关闭后在后台继续将页面执行完毕?
http://topic.csdn.net/u/20070202/14/85ea5576-907a-4960-9c53-b206a05228e4.html

在 ASP.NET 中使用计时器(Timer)
http://blog.joycode.com/percyboy/articles/3595.aspx

ASP.NET 2.0 中的异步页
http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true

IsClientConnected的问题
http://topic.csdn.net/u/20080712/19/74fa4070-84bd-4fda-a99b-ac361f874738.html

Response.IsClientConnected 原理和用法
http://blog.51ait.cn/article.asp?id=357 第一个地址比较慢,可以看下一个地址
http://blog.joycode.com/ghj/archive/2008/07/23/115198.aspx

分享到:
评论

相关推荐

    Asp.net Popup Control

    PopupControl 是一个可以在 ASP.Net 页面上“弹出”一个界面部分的 ASP.Net AJAX 控件。...当这个页面部分被“弹出”的时候, 一个简单的服务器端事件或者相关的客户端代码可以很方面的关闭这个“弹出”操作。

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

    asp.net下模态对话框关闭之后继续执行服务器端代码的问题

    在Asp.net里弹出模态对话框容易,但是在模态对话框关闭之后还要继续执行服务器代码,这就要求当对话框关闭之后页面要立即提交。于是有了以下的解决方法。 在Web Form中拖入服务器端按钮,并假设此按钮ID为 ...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    ● 使用新的Master页面特性创建模板化的ASP.NET页面 ● 调试和处理错误的技术 ● 提取、创建、处理和存储XML的各种框架 ● 打包和部署ASP.NET应用程序的方法 ● 快速、逻辑地检索、更新和删除数据 本书读者对象 ...

    ASP.NET2.0高级编程(第4版)1/6

    3.2 ASP.NET页面结构选项43 3.2.1 内置编码44 3.2.2 新的后台编码模型46 3.3 ASP.NET 2.0的Page指令48 3.3.1 @Page49 3.3.2 @Master51 3.3.3 @Control52 3.3.4 @Import53 3.3.5 @Implements54 3.3.6 @Register55 ...

    net学习笔记及其他代码应用

    答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。 24.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。 答:string str = null 是不给他分配...

    ASP200问.EXE

    第2章 ASP.NET运行模型 12.如何定义变量和判定变量类型 13.什么是变量的作用域 14.如何强制要求显式声明变量 15.如何保留或消除过程调用对变量的影响 16.如何创建和调整动态数组 18.如何计算中英文混合字符串的...

    ExtAspNet_v2.3.2_dll

    -在AJAX回发后确保Asp.net的按钮控件仍然具有AJAX的特性。 -更新/basic/login.aspx示例,使用验证图片(feedback:kedee)。 -为Grid增加AutoPostBack属性和RowClick事件,示例在/data/grid_autopostback.aspx...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -在AJAX回发后确保Asp.net的按钮控件仍然具有AJAX的特性。 -更新/basic/login.aspx示例,使用验证图片(feedback:kedee)。 -为Grid增加AutoPostBack属性和RowClick事件,示例在/data/grid_autopostback.aspx...

    网络多人对战台球(服务器完整版)使用自己论坛的虚拟币

    一、将服务器端目录下的文件放到任意目录(无须论坛所在目录)用记事本打开jh.sml文件,修改里面的“旗帜”字样为你自己论坛的名称,打开控制面板==》》管理工具==》》数据源 (ODBC),在ODBC数据源中设置一个名...

    C#实训教程

    23.1 ASP.NET页面 409 23.2 虚拟目录 421 23.3 内容总结 423 24 Web服务器控件 424 24.1 Web 控件 424 24.2 复杂控件 429 24.3 内容总结 431 25 HTML控件 432 25.1 服务器控件 432 25.2 HTMLForm控件 432 ...

    计算机二级Web程序设计模拟卷(三).doc

    下列语言编写的代码中,在浏览器端执行的是______。 A.Web页面中的c#代码 B.Web页面中的Java代码 C.Web页面中的PHP代码 D.Web页面中的JavaScript代码 正确答案:D 您的答案: 本题解析: 暂无解析 6.在HTTP/1.1协议...

    IIS6.0 IIS,互联网信息服务

     第二篇 IIS之FTP服务器 一、建立你的FTP站点 第一个FTP站点(即“默认FTP站点”)的设置方法和更多FTP站点的建立方法请参照前文Web服务器中相关操作执行。需要注意的是,如果你要用一个IP地址对应多个不同的FTP...

    EasyHost虚拟主机管理 v3.0.rar

    ※ 自由添加多台被控端服务器,建立服务器集群。 ※ 自主选择服务器所提供的服务,如:该台服务器只允许开通虚拟主机和数据库。另外一台只开通企业邮局。 ※ 服务器开设限制,您可以限制该台服务器最多开通多少M...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的WEB站点。本教程并不想让你完全了解这种语言,只是能使你尽快加入开发动态web站点的行列。我假定你有一些HTML...

    C#编程经验技巧宝典

    111 &lt;br&gt;0184 如何在ASP.NET中获取文件的扩展名 111 &lt;br&gt;0185 如何在ASP.NET中用URL在页面之间传值 112 &lt;br&gt;0186 如何使用IsPostBack实现ASP.NET页面加载 112 &lt;br&gt;0187 如何利用输出缓存技术缓存...

    虚拟主机管理(功能强大,全面,智能)

    ※ 自由添加多台被控端服务器,建立服务器集群。 ※ 自主选择服务器所提供的服务,如:该台服务器只允许开通虚拟主机和数据库。另外一台只开通企业邮局。 ※ 服务器开设限制,您可以限制该台服务器最多开通多少M空间...

Global site tag (gtag.js) - Google Analytics