高分求解释一个委托事件的问题!!

foyuan 2006-10-23 05:02:46
public delegate void SetStat(string text);

public class a
{
public event SetStat StatUpdated;
}

一个aspx中

Page_Load()
{
a=new a();
a.StatUpdated+=new SetStat(d);
}
public void d(string text)
{
Response.Write(t); //************错误之处****************//
}

谁能解释一下 为什么上面会出错 说Response不在上下文环境中 事件的执行的上下文环境还是在原来的类的上下文环境吗??
应该不是吧,ASPX里面那么多事件调用都不出错的呀
...全文
266 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
foyuan 2006-11-07
  • 打赏
  • 举报
回复
aafshzj(上海北京)

sp1234(3+1=无穷大)

发现问题和上面两位说的相同

因为是Response对象已经消亡的原因 并非我个人的理解
aafshzj 2006-10-25
  • 打赏
  • 举报
回复
个人理解,你这样写的话 public void d(string text) 方法就是属于class a的一个成员,在class a里自然也就不能这样调用 Response.Write(t);了,改成HttpContext.Current.Response.Write(t);试试看

==================================================

呵呵,这个不对。d值在在执行线程上和calss a的那个实例联系在一起,在对象关系上还是属于原页面的。问题肯定是因为页面的原页面的HttpContext已经失效了。

无论你的delegate在哪个页面实例工作。你只能把你希望的结果从你当前的页面实例输出(调转等不算)。
andry_zeng 2006-10-25
  • 打赏
  • 举报
回复
今天特别做了下实验,似乎我原来的理解是错误的。代码如下,能把message打印出来
//TestDelegate.cs
namespace Test
{
public delegate void SetStat(string text);

public class TestDelegate
{
public event SetStat StatUpdated;

public void RaiseEvent(string message)
{
this.StatUpdated(message);
}
}
}

//Default.aspx.cs
using Test;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
TestDelegate td = new TestDelegate();
td.StatUpdated += new SetStat(WriteMessage);
td.RaiseEvent("this is a message<br/>");
}

public void WriteMessage(string message)
{
Response.Write(message);
}
}
看来原因应该是楼上 “aafshzj(上海北京)” 大牛所说的,楼主是不是在当前页面Response对象回收之后执行的类似我这里写的RaiseEvent方法?

foyuan 2006-10-24
  • 打赏
  • 举报
回复
Andry_Zeng()
我也觉得应该这么理解

把事件的方法也理解为该类的成员

但是这样的话我觉得 事件的委托就有很大的局限性了

sp1234(3+1=无穷大)
我觉得是不是应该按照Andry_Zeng() 的理解呢?
这样的话 出错就容易理解了

  • 打赏
  • 举报
回复
如果你有个线程在page里边调用a.SetStat,如果此时page已经处理完了客户端请求,此时page对象仍然存在,但是Response、Request都应该不在了。
  • 打赏
  • 举报
回复
从代码上看不到你的 a.SetStat 方法什么时候触发的,就不知道为何没有 Response。如果此时不是在page的某个事件中,而是page都已经处理完了丢出html给客户端了,Response找不到了很正常。即使HttpContext.Current.Response也很可能会是null。
股神 2006-10-23
  • 打赏
  • 举报
回复
upp
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
如果不是一个页面,那就改用HttpContext.Current.Response,原来的Response实例可能已经被回收了。
GHOSTSEA 2006-10-23
  • 打赏
  • 举报
回复
关注中,
学习中,
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
你调用ExecuteCommand('dd');的页面和 a=new a();的不是同一个页面吧?如果我说得不错,那你这样调用就是问题所在。
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
当然有关。在触发事件的时候,page的asp.ent 事件周期可能已经完成,那Response这个对象可能已经不能访问了。

你想嘛,如果请求都已处理完成了,你写到哪里去呀?
andry_zeng 2006-10-23
  • 打赏
  • 举报
回复
个人理解,你这样写的话 public void d(string text) 方法就是属于class a的一个成员,在class a里自然也就不能这样调用 Response.Write(t);了,改成HttpContext.Current.Response.Write(t);试试看
foyuan 2006-10-23
  • 打赏
  • 举报
回复
与什么时候触发的这个事件有关系吗?/


我就是在一个方法里面

public class a
{
public event SetStat StatUpdated;
public ExecuteCommand(string text)
{
//在此触发
}
}

web页面调用ExecuteCommand('dd');
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
那问题就在于你什么时候触发StatUpdated事件?
foyuan 2006-10-23
  • 打赏
  • 举报
回复
不好意思 由于是手工输入 所以可能有输入错误

不是那个t的问题
正确的就是把t写成text也会有这个问题


但是这个方法在一个Page里面写的 这样都不行吗?
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
t->text,估计是楼主拷漏了,应该不是问题的原因,
aafshzj 2006-10-23
  • 打赏
  • 举报
回复

改成这样:

public delegate void SetStat(string text, HttpResponse response);

public class a
{
public event SetStat StatUpdated;
}

一个aspx中

Page_Load()
{
a=new a();
a.StatUpdated+=new SetStat(d);
}
public void d(string text, HttpResponse response)
{
response.Write(t); //************错误之处****************//
}
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
Response其实是Page的一个属性。你要在其它地方使用的话,必须用参数传过来。
feiyun0112 2006-10-23
  • 打赏
  • 举报
回复
t没定义

*****************************************************************************
欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码)
http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html

62,244

社区成员

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

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

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

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