[英]c# event handling
我有一个提供自定义事件的类:
public delegate void ResultEvent(bool result);
public class Service : INotifyPropertyChanged
{
public event ResultEvent Result;
}
其他两个对象对此的引用如下:
public partial class SomeRandomClass
{
private Service service;
public SomeRandomClass()
{
this.InitializeComponent();
service = new Service();
service.Result += new ResultEvent(service_Result);
}
}
问题是,如果分派了事件,则只有最后一个创建“服务”新对象的对象才能识别。 如果我对先前生成的对象执行“服务”操作,以便必须分派事件,则该事件将在“服务”对象中引发,但不会调用处理程序。
有人知道我可能是什么问题吗?
听起来您在某个地方有一个静态引用,每次创建新实例时,该静态引用都可能会被覆盖,但是到目前为止您提供的代码中没有类似的内容。 您确实希望每个Service
实例都有其自己的独立处理程序集,对吗?
您能发布一个简短但完整的程序来演示问题吗? 基本上删除所有“真实”代码,直到获得事件处理和触发为止。 (您可以使事件触发类似计时器的事件。)
ResultEvent
委托不是静态的SomeRandomClass
每个实例将具有其自己的Service
实例,并且它是向该Service
实例的事件注册的自己的委托,而不是其他SomeRandomClass
的服务实例。
我真的不明白你的要求。 这有帮助吗?
这不是很多信息,但是这对我来说就是这样。 Service
是SomeRandomClass
内的一个实例变量,因此,如果您丢失对SomeRandomClass
引用,则它将被垃圾回收,并且该事件永远不会触发。
但是,如果您发布了完整的示例,将会很有帮助。
为了演示我在说什么,请考虑以下示例。
SomeRandomClass x;
for(int i =0; i< 10; i++)
{
x = new SomeRandomClass(); //this will subscribe to only the last isntance
}
缺少一个不完整的代码,尽管实现了INotifyPropertyChanged
但在'PropertyChanged'事件上引发的事件又在哪里呢?
您还缺少引发Result
事件的方法...我已经修改了代码以适合您的目的...恕我直言,您在连接事件处理程序时应使用标准的Event参数,因为这是常规模式在整个框架中使用...
service.Result += new ResultEvent(service_Result); private void service_Result(object sender, EventArgs e){ .... }
为了完成起见,我已经修改了下面的代码以完成它...
public class Service : INotifyPropertyChanged { public delegate void ResultEvent(bool result); public event ResultEvent Result; // Where's the raise property changed event handler? private void OnServiceResult(bool result){ if (this.Result != null) this.Result(result); } }
希望这对您有所帮助,汤姆,谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.