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

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里面那么多事件调用都不出错的呀
...全文
309 19 打赏 收藏 转发到动态 举报
写回复
用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
内容概要:本文围绕基于Boost MPPT与双PI闭环双向DC-DC的离网光伏储能系统展开,系统性地研究了其动力学建模与稳态特性分析,并通过Simulink平台实现了完整的仿真验证。研究构建了涵盖光伏阵列、最大功率点跟踪(MPPT)控制、双向DC-DC变换器及储能电池的整体系统架构,采用Boost电路实现高效MPPT控制,并引入电压-电流双闭环PI控制策略,实现对储能系统精确的充放电管理。文章深入分析了系统在光照强度与环境温度双重扰动下的动态响应与稳态性能,验证了所提出模型的准确性与控制策略在不同工况下的鲁棒性与有效性,为离网光伏储能系统的优化设计与工程应用提供了坚实的理论基础和仿真依据。; 适合人群:具备电力电子技术、新能源系统或自动控制理论等相关专业知识背景,从事光伏储能系统、微电网或可再生能源领域研究与仿真的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握离网光伏储能系统的完整建模方法与关键参数设计流程;② 深入理解Boost电路MPPT控制与双向DC-DC变换器双PI闭环控制的协同工作机制与实现细节;③ 通过Simulink仿真分析系统在光照突变、温度变化等动态扰动下的稳态特性、电压稳定性和能量管理性能;④ 为实际离网系统的控制器设计、参数整定及性能优化提供可靠的理论指导和仿真验证手段。; 阅读建议:建议结合提供的Simulink仿真模型同步学习,重点关注MPPT算法的实现逻辑、双PI控制器的参数整定方法以及系统在不同环境条件和负载变化下的响应特性,可在此基础上进一步探索多目标优化控制或智能控制策略的应用。

62,272

社区成员

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

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

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

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