C # - обработчики событий, торчащие в памяти - PullRequest
0 голосов
/ 24 августа 2011

У меня есть проблема в моем приложении C # .NET, которую я не могу понять, как решить. У меня есть объект, который имеет метод под названием «Load». Если объект успешно загружен, запускается одно событие. Если объект не загружается, запускается другое событие. Эта сущность определяется следующим образом:

public class MyEntity
{
  public event EventHandler Load_Succeeded;
  public event EventHandler Load_Failed;
  public void Load()
  {
    /*
     Asynchronously load the entity code here.
    */
  }

  private void Load_Completed(IAsyncResult result)
  {
    // Fire Load_Succeeded or Load_Failed
  }
}

Теперь, если загрузка не удалась, я сохраняю объект в изолированном хранилище, чтобы попытаться загрузить его позже. Когда я пытаюсь загрузить объект позже, у меня есть следующий код:

MyEntity myEntity = GetFromIsolatedStorage();
myEntity.Load_Failed -= new EventHandler(myEntity_Load_Failed);
myEntity.Load_Failed += new EventHandler(myEntity_Load_Failed);

myEntity.Load_Succeeded -= new EventHandler(myEntity_Load_Succeeded);
myEntity.Load_Succeeded += new EventHandler(myEntity_Load_Succeeded);
myEntity.Load();

Странная часть: когда я запускаю код загрузки через объект, загруженный из изолированного хранилища, выполняются оригинальные обработчики событий Load_Failed и Load_Succeeded. Хотя я использую "- =". Что я делаю неправильно? Как очистить все обработчики событий на объекте, чтобы я мог по существу сбросить их?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

Вы можете удалить eventHandler только для объекта, который определяет событие. Это означает, что вы можете использовать это:

    public class MyEntity
{
  public event EventHandler Load_Succeeded;
  public event EventHandler Load_Failed;
  public void Load()
  {
    /*
     Asynchronously load the entity code here.
    */
  }

  private void Load_Completed(IAsyncResult result)
  {
    // Fire Load_Succeeded or Load_Failed
  }

  public void ResetEvents()
  {
        this.Load_Succeeded = null;
        this.Load_Failed = null;
  }

}

А потом просто позвоните

myEntity.ResetEvents();
1 голос
/ 24 августа 2011

Давайте напишем ваш код следующим образом, это тот же код, но более понятный:

MyEntity myEntity = GetFromIsolatedStorage(); 
myEntity.Load_Failed -= new EventHandler(this.myEntity_Load_Failed);
myEntity.Load_Failed += new EventHandler(this.myEntity_Load_Failed); 

- = оператор удаляет подписку на событие, если событие уже содержит того же подписчика: this.myEntity_Load_Failed . Я не знаю структуру вашей программы, но я думаю, что у события в этом случае есть другой подписчик (не «это»), и эта строка не имеет никакого эффекта. Вам необходимо перенести операцию отказа от подписки - = в место, где известен абонент.

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