Ограничение асинхронных событий для вызывающего объекта - PullRequest
2 голосов
/ 03 февраля 2010

в моем C # -Silverlight-3-Application я создал класс, который выполняет некоторые вычисления, которые используются в различных частях моей программы. Этот класс нуждается в данных из базы данных, поэтому он вызывает WCF-Service для получения данных. Структура класса выглядит следующим образом:

public class ConsumptionCalculation
{
  // Declare the event to notify subscribers, that the calculation has finished
  public delegate void HandlerConsumtionCalculationFinished(object sender, ConsumtionCalculationArgs args);
  public event HandlerConsumtionCalculationFinished CalculationFinished;

  public void Do(int id)
  {
    // call the WCF-Service
    DataContainer.instance.dataSource.GetConsumtionInfoAsync(id);
  }

  void dataSource_GetConsumtionInfoCompleted(object sender, GetConsumtionInfoCompletedEventArgs e)
  {
    // Receive the result of the WCF-Service call
    // do some calculation here and put the results in the variable 'args'

    // Raise an event to notify listeners, that the calculation is finished
    CalculationFinished(this, args);
  }
}

Объекты, которым требуется класс расчета, ссылаются на него и подписываются на событие CalculationFinished.

public class IUseTheCalculation
{
  ConsumptionCalculation _calcObject;

  public IUseTheCalculation()
  {
    _calcObject = new ConsumptionCalculation();
    _calcObject.CalculationFinished += new HandlerConsumptionCalculationFinished(CalculationFinishedEvent);
  }

  private void CalculationFinishedEvent(object sender, ConsumptionCalculationArgs args)
  {
    // use the calculation to display data or write it to a file or whatever
  }
}

У меня есть несколько классов, таких как класс IUseTheCalculation, у каждого из которых есть свой собственный объект ConsulationCalculation-Object.

Моя проблема заключается в следующем: Когда я вызываю метод Do объекта ConsumeCalculation в одном из классов, ВСЕ классы, имеющие ссылку на любой объект ConsumpCalculation, получат полученное событие CalculationFinished. Я думаю, это потому, что все существующие объекты ConsuptionCalculation получают событие dataSource_GetConsumtionInfoCompleted от службы WCF. Но я хочу, чтобы только вызывающий объект получил событие. Я думаю, что существует стандартный подход к решению этой проблемы, но я пока не могу понять это. Как бы вы решили эту проблему?

Спасибо заранее, Frank

Ответы [ 2 ]

1 голос
/ 07 марта 2010

Мне кажется подозрительным:

   public void Do(int id)
   {
       // call the WCF-Service
        DataContainer.instance.dataSource.GetConsumtionInfoAsync(id);
   }

Как DataContainer.instance.dataSource говорят связать этот идентификатор с этим экземпляром ConsulationCalculation? Это делается в конструкторе, как это?

public ConsumptionCalculation()
{
    DataContainer.instance.dataSource.OnGetConsumptionInfoComplete += CalculationFinishedEvent;
}

Каким-то образом устанавливается соединение между DataContainer.instance и каждым экземпляром ConsulationCalculation, и я уверен, что вы подключаете каждый из них к одному событию.

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

Вы не показали, где или как вы объявляете событие CalculationFinished. Если бы это было статично, это объяснило бы поведение, которое вы видите. Но я предполагаю, что вы уже это проверили. Возможно, в отладчике вы могли бы исследовать рассматриваемые объекты, чтобы определить, являются ли они на самом деле различными экземплярами, как вы предполагаете.

Не могли бы вы использовать поле "id" для различения различных абонентов (и, если нет, возможно, добавить для этого дополнительный параметр)? Это не помешает другим классам получать уведомления, но все они могут быстро проверить, предназначены ли уведомления для них, и быстро вернуться, если нет.

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