2012-03-16 1 views
5

У меня есть класс A ... в его конструкторе ... Я назначаю анонимную функцию для eventHandler объекта Object_B.Как отменить анонимную функцию в методе Dispose класса?

Как удалить (отменить подписку), что из метода Dispose класса A?

Любая помощь будет оценена! Спасибо

Public Class A 
{ 

public A() 
{ 

B_Object.DataLoaded += (sender, e) => 
       { 
        Line 1 
        Line 2 
        Line 3 
        Line 4 
       }; 
} 

Public override void Dispose() 
{ 
    // How do I unsubscribe the above subscribed anonymous function ? 
} 
} 
+0

Что такое B_Object? Является ли это переменной-членом класса A? И доступно ли оно где-либо вне А; возможно, у него есть другие слушатели? –

+0

Возможный дубликат [Отменить анонимный метод в C#] (http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c-sharp) –

+0

да, это член ... какой экземпляр класса B – Relativity

ответ

7

Вы не можете, в принципе. Либо переместить его в метод, или использовать переменную-член, чтобы держать делегата позже:

public class A : IDisposable 
{ 
    private readonly EventHandler handler; 

    public A() 
    { 
     handler = (sender, e) => 
     { 
      Line 1 
      Line 2 
      Line 3 
      Line 4 
     }; 

     B_Object.DataLoaded += handler; 
    } 

    public override void Dispose() 
    { 
     B_Object.DataLoaded -= handler; 
    } 
} 
+0

Черт, ты избил меня! – Robbie

+0

Итак, если мы не отказались от подписки, что ... это, очевидно, приведет к утечке памяти, не так ли? – Relativity

+1

@ Релятивность: не обязательно. Вы действительно не говорили о 'B_Object.DataLoaded' - если это * на самом деле * событие экземпляра, а не статическое событие, то если объект будет собран, подписка на события больше не будет иметь значения. Все зависит от контекста ... –

0

Правильный способ сделать это состоит в использовании Rx расширения. Перейти смотреть видео здесь:

http://msdn.microsoft.com/en-us/data/gg577611

Я нашел «блюз» фильм особенно полезным.

0

Это альтернатива без использования переменной обработчика.

Public Class A 
{ 

public A() 
    { 

    B_Object.DataLoaded += (sender, e) => 
       { 
        Line 1 
        Line 2 
        Line 3 
        Line 4 
       }; 
    } 

    Public override void Dispose() 
    { 
    if(B_Object.DataLoaded != null) 
    { 
    B_Object.DataLoaded -= 
     (YourDelegateType)B_Object.DataLoaded.GetInvocationList().Last(); 
     //if you are not sure that the last method is yours than you can keep an index 
     //which is set in your ctor ... 
    } 
    } 
} 

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

  • Нет связанных вопросов^_^