繁体   English   中英

C#事件处理

[英]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的服务实例。

我真的不明白你的要求。 这有帮助吗?

这不是很多信息,但是这对我来说就是这样。 ServiceSomeRandomClass内的一个实例变量,因此,如果您丢失对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM