обработка событий c # - PullRequest
       10

обработка событий c #

2 голосов
/ 18 февраля 2010

У меня есть класс, который предоставляет пользовательское событие:

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);
    }
}

Проблема в том, что только последний объекткоторый создает новый объект «Сервис», кажется, распознает, если событие отправлено.Если я что-то сделаю с «Сервисом» для сгенерированных объектов, так что событие должно быть отправлено, событие будет вызвано в «Сервисе» -объекте, но обработчик не будет вызван.

У кого-нибудь есть идея, в чем может быть моя проблема?

Ответы [ 4 ]

1 голос
/ 18 февраля 2010

Звучит так, будто у вас есть статическая ссылка где-то, которая может быть перезаписана при каждом создании нового экземпляра, но в коде, который вы предоставили, нет ничего подобного.Вы хотите, чтобы каждый Service экземпляр имел свой собственный отдельный набор обработчиков, верно?

Не могли бы вы опубликовать короткую, но полную программу, которая демонстрирует проблему?По сути, вырывайте весь «настоящий» код, пока все, что у вас есть, - это обработка событий и запуск.(Вы можете сделать событие запускающим что-то вроде таймера.)

0 голосов
/ 18 февраля 2010

Отсутствует неполный код, где происходит событие для события PropertyChanged, несмотря на то, что оно реализует INotifyPropertyChanged?

Вам также не хватает средства для вызова события Result ... Я изменил код в соответствии с вашими целями ... ИМХО, вы должны использовать стандартные параметры события при подключении обработчика события как это общий шаблон, используемый во всей платформе ...

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);
    }
}

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 18 февраля 2010

Это не тонна информации, однако это то, что мне кажется. Service - это переменная экземпляра внутри SomeRandomClass, поэтому, если вы теряете ссылку на SomeRandomClass, она получает мусор и событие никогда не запускается.

Однако было бы полезно, если бы вы опубликовали полный пример.

Чтобы продемонстрировать, о чем я говорю, рассмотрим следующий пример.

SomeRandomClass x;
for(int i =0; i< 10; i++)
{
  x = new SomeRandomClass(); //this will subscribe to only the last isntance
}
0 голосов
/ 18 февраля 2010

Делегат ResultEvent не является статичным - каждый экземпляр SomeRandomClass будет иметь свой собственный экземпляр Service, и его собственный делегат будет зарегистрирован на событие этого экземпляра Service, а не какая-либо другая служба SomeRandomClass. экземпляр.

Я не совсем понимаю, о чем ты просишь; это полезно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...