Removing anonymous event handler

后端 未结 3 2020
半阙折子戏
半阙折子戏 2021-01-03 19:57

I have the following code where SprintServiceClient is a reference to a WCF Service-

public class OnlineService
{
    private SprintServiceClient _client;
           


        
相关标签:
3条回答
  • 2021-01-03 20:14

    You can refer to your anonymous method from inside itself as long as you assign a delegate to a variable first:

    EventHandler<SomeEventArgs> handler = null;
    handler = (s, e) =>
        {
            _client.AddMemberToTeamCompleted -= handler;
            callback(e.Result);
        };
    
    _client.AddMemberToTeamCompleted += handler;
    

    Note that you need to declare the variable and assign it separately or the compiler will deem it uninitialized when you come to use it inside the method body.

    0 讨论(0)
  • 2021-01-03 20:22

    No there is no way,

    Apparantly Tim and Marc have another nice solution

    But you can always just name them, and do the -= on the named eventhandler on this method ;)

    Guessing your event:

    _client.AddMemberToTeamCompleted += OnAddMemberToTeamCompleted;
    

    and

    public void OnAddMemberToTeamCompleted(object sender, EventArgs args)
    {
        _client.AddMemberToTeamCompleted -= OnAddMemberToTeamCompleted;
        callback(e.Result)
    }
    

    Next problem is getting this callback in your listener. Perhaps putting it on a Property in the EventArgs (but that feels kinda dirty, I agree)

    0 讨论(0)
  • 2021-01-03 20:24

    The trick to making a self-unsubscribing event-handler is to capture the handler itself so you can use it in a -=. There is a problem of declaration and definite assignment, though; so we can't do something like:

    EventHandler handler = (s, e) => {
        callback(e.Result);
        _client.AddMemberToTeamCompleted -= handler; // <===== not yet defined     
    };
    

    So instead we initialize to null first, so the declaration is before the usage, and it has a known value (null) before first used:

    EventHandler handler = null;
    handler = (s, e) => {
        callback(e.Result);
        _client.AddMemberToTeamCompleted -= handler;        
    };
    _client.AddMemberToTeamCompleted += handler;
    
    0 讨论(0)
提交回复
热议问题