C # Delete an event handler after it is called or calls it only once

_cefGlueBrowser.LoadEnd += (s, e) =>
{
    BeginInvoke(new Action(() =>
    {
         MyCefStringVisitor visitor = new MyCefStringVisitor(this, m_url);
         e.Browser.GetMainFrame().GetSource(visitor);
         loaded = true;
    }));
};

But the problem is that the Event Handler is called many times. For example, after rebooting JS. How to delete multiple calls. How to trigger an event LoadEndonly once.

I'm trying with

_cefGlueBrowser.LoadEnd -= delegate { };

but does not work.

What can I do? I want to call him only once!

+4
source share
4 answers

Create method

public void Browser_LoadEnd(object sender, EventArgs e)
{
    BeginInvoke(new Action(() =>
    {
         MyCefStringVisitor visitor = new MyCefStringVisitor(this, m_url);
         _cefGlueBrowser.Browser.GetMainFrame().GetSource(visitor);
         loaded = true;
    }));
}

subscribe

_cefGlueBrowser.LoadEnd += Browser_LoadEnd;

and unsubscribe

_cefGlueBrowser.LoadEnd -= Browser_LoadEnd;

Notice, I assume that the event LoadEndaccepts EventArgs, and not some derived class.

+2
source
EventHandler handler = null;
obj.SomeEvent += handler = (s, e) => {
    obj.SomeEvent -= handler;
    // more stuff
};

, , ( ), .

+18

Define an event handler in a separate method and add the unsubscribe operation to the method body:

public EventHandler OnLoadEnd(object sender, <args>)
{
    BeginInvoke(new Action(() =>
                    {
                        MyCefStringVisitor visitor = new MyCefStringVisitor(this, m_url);
                        _cefGlueBrowser.Browser.GetMainFrame().GetSource(visitor);
                        loaded = true;
                    }));

    _cefGlueBrowser.LoadEnd -= OnLoadEnd;
}
+2
source

Based on Mark Gravel's answer, I think you also need at least a flag

        bool done = false;
        EventHandler eh = null;
        obj.evt += eh = (_, e) => {
            obj.evt -= eh;
            if (done)
                return;
            done = true;

            // stuff
        };
+1
source

All Articles