Проблема обработки событий в C # для базовых и производных классов - PullRequest
1 голос
/ 27 марта 2011

У меня есть такой случай, когда я создаю 2 разных обработчика событий, помещенных в базовый класс, и подписываюсь на них соответственно из классов Quotes и Charts.У меня проблема в том, что первая подписка срабатывает нормально для первого события, но любые последующие подписки не выполняются.Я включил пример 2 разных обработчиков, Quotes и Charts, Quotes выполняется без проблем, но Charts не запускается при получении данных.

Базовый класс:

public abstract class MyBaseClass
{
    protected virtual void RaiseOnQuoteData(string item) { }
    protected virtual void RaiseOnChartData(string item) { }

    void OnDataReceived(object sender, DataEventArgs e)
    {
        if (e.Item == "QUOTE")
            RaiseOnQuoteData(e.Item);
        else if (e.Item == "CHART")
            RaiseOnChartData(e.Item);
    }
}

Классы кавычек и диаграмм:

public class Quote : MyBaseClass
{
    public event EventHandler<DataEventArgs<quoteRecord>> OnQuoteData;

    protected override void RaiseOnQuoteData(string item)
    {
        OnQuoteData.Raise<DataEventArgs<quoteRecord>>(this, new DataEventArgs<quoteRecord>(item));
    }
}

public class Chart : MyBaseClass
{
    public event EventHandler<DataEventArgs<chartRecord>> OnChartData;

    protected override void RaiseOnChartData(string item)
    {
        OnChartData.Raise<DataEventArgs<chartRecord>>(this, new DataEventArgs<chartRecord>(item));
    }
}

Подписка:

public class QuoteSubscription
{
    public static void SubscribetoQuoteData()
    {
        Quote Q = new Quote();
        Q.OnQuoteData += new EventHandler<DataEventArgs<quoteRecord>>(q_OnQuoteData);
    }

    static void q_OnQuoteData()
    { 
        //Executes fine
    }
}

public class ChartSubscription
{
    public static void SubscribetoChartData()
    {
        Chart C = new Chart();
        C.OnChartData += new EventHandler<DataEventArgs<chartRecord>>(q_OnChartData);
    }

    static void q_OnChartData()
    {
        //Does not execute
    }
}

Это реализовано в ASP.NET 4.0. Есть ли вероятность того, что создание производных классов может быть проблемой, поскольку оба классаделить один и тот же базовый класс?Любая помощь, указывающая на причину, будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Что там в рейзе?Это должен быть метод расширения, так как EventHandler сам по себе не определяет такой метод.Следовательно, вы можете установить точку останова и посмотреть, что происходит.(И вы могли бы также поставить точку останова внутри RaiseOnChartData.)

0 голосов
/ 27 марта 2011

Может быть, вы создаете объект в области действия метода и вышли за его пределы. Вы можете получить первое сообщение по стечению обстоятельств только потому, что оно не было GC-ed. Попробуйте создать объекты кавычек и диаграмм как статический объект-член класса

...