I have the following code:
public List<IWFResourceInstance> FindStepsByType(IWFResource res)   {       List<IWFResourceInstance> retval = new List<IWFResourceInstance>();       this.FoundStep += delegate(object sender, WalkerStepEventArgs e)                          {                            if (e.Step.ResourceType == res) retval.Add(e.Step);                          };       this.Start();       return retval; }   Notice how I register my event member (FoundStep) to local in-place anonymous function.
My question is: when the function 'FindStepByType' will end - will the anonymous function be removed automatically from the delegate list of the event or I have to manually remove it before steping out the function? (and how do I do that?)
I hope my question was clear.
Your code has a few problems (some you and others have identified):
To fix this, and still use an anonymous delegate, assign it to a local variable, and then remove the handler inside a finally block (necessary in case the handler throws an exception):
  public List<IWFResourceInstance> FindStepsByType(IWFResource res)   {      List<IWFResourceInstance> retval = new List<IWFResourceInstance>();      EventHandler<WalkerStepEventArgs> handler = (sender, e) =>      {         if (e.Step.ResourceType == res) retval.Add(e.Step);      };       this.FoundStep += handler;       try      {         this.Start();      }      finally      {         this.FoundStep -= handler;      }       return retval;   } With C# 7.0+ you can replace the anonymous delegate with a local function, achieving the same effect:
    public List<IWFResourceInstance> FindStepsByType(IWFResource res)     {         var retval = new List<IWFResourceInstance>();          void Handler(object sender, WalkerStepEventArgs e)         {             if (e.Step.ResourceType == res) retval.Add(e.Step);         }          FoundStep += Handler;          try         {             this.Start();         }         finally         {             FoundStep -= Handler;         }          return retval;     } Below is approach about how unsubscribe event in anonymous method:
DispatcherTimer _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromMilliseconds(1000); EventHandler handler = null;  int i = 0;  _timer.Tick += handler = new EventHandler(delegate(object s, EventArgs ev) {     i++;     if(i==10)         _timer.Tick -= handler; });  _timer.Start(); If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With