2015-01-27 4 views
0

Скажем, у меня есть статический класс A который имеет статическую событие:Где отвязать статические обработчики событий?

public static class A 
{ 
    public static event Action SampleEvent; 

    //other members of A ... 
} 

У меня есть статический класс B, который связывается с этим событием:

public static class B 
{ 
    public static void DoSomeJob() 
    { 
     // To do some job, I need to bind to A.SampleEvent 
     // A.SampleEvent +=  
     // After the job is done, I still need the event handler, bound to A.SampleEvent, to update some thing in B 
    } 

    //other members of B ... 
} 

Вопрос заключается в том, что хорошее место для отказа от A.SampleEvent? К сожалению, для статических классов нет деструктора.

+0

Вы можете отвязать как только пожары события, т.е. внутри самого обработчика событий? –

+2

Если вы не можете детерминистически определить, когда отказаться от подписки на это событие, тогда нет. Если вы можете: тогда делать в то время, когда сможете. Деструктор (или финализатор, который он должен вызывать в C#) в нестатических классах не является детерминированным: вы не знаете, когда он будет вызван: вы даже не можете гарантировать, что он будет вызван вообще (поэтому ' IDisposable' существует). – Jcl

+1

Кроме того, наличие не слабого локального делегата, подписанного на мероприятие, является способом убедиться, что объект никогда не будет собран (поэтому его финализатор никогда не вызывал), поэтому отказ от подписки есть просто абсурд – Jcl

ответ

1

Одно место будет непосредственно в обработчике после его обновления B:

public static class B 
{ 
    public static void DoSomeJob() 
    { 
     // To do some job, I need to bind to A.SampleEvent 
     A.SampleEvent += A_SampleEvent; 
     // do job 
    } 

    private static void A_SampleEvent(object sender, EventArgs args) 
    { 
     // update B 
     A.SampleEvent -= A_SampleEvent; 
    } 

    //other members of B ... 
} 
Смежные вопросы