簡體   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