2011-08-24 3 views
0

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

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 обработчики событий выполняются , Хотя я использую «= =». Что я делаю не так? Как очистить все обработчики событий от объекта, чтобы я мог по существу их сбросить?

Спасибо!

+0

Из вашего образца кода старые и новые обработчики «сбой» называются «myEntity_Load_Failed», поэтому как вы можете сказать, что это был «оригинальный» обработчик, который был вызван? – Gabe

ответ

2

Вы можете удалить 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(); 
+0

Это потрясающе! Я не знал, что ты можешь это сделать! благодаря! – user609886

1

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

 
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. Я не знаю вашей структуры программы, но я думаю, что в этом случае у этого события есть другой подписчик (а не «этот»), и эта строка не имеет никакого эффекта. Вам нужно переместить операцию отмены подписки - = в том месте, где известен абонент.

Смежные вопросы