C#在调用后删除事件处理程序或只调用一次

C#在调用后删除事件处理程序或只调用一次,c#,events,C#,Events,但问题是事件处理程序被多次调用。例如,每次重新加载JS之后。如何删除多个呼叫。如何只调用一次LoadEnd事件 我试着用 _cefGlueBrowser.LoadEnd += (s, e) => { BeginInvoke(new Action(() => { MyCefStringVisitor visitor = new MyCefStringVisitor(this, m_url); e.Browser.GetMainFram

但问题是事件处理程序被多次调用。例如,每次重新加载JS之后。如何删除多个呼叫。如何只调用一次
LoadEnd
事件

我试着用

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

我能做什么?我只想叫它一次

创建一个方法

_cefGlueBrowser.LoadEnd -= delegate { };
订阅

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;
    }));
}
取消订阅

_cefGlueBrowser.LoadEnd += Browser_LoadEnd;

注意,我假设
LoadEnd
事件采用
EventArgs
而不是某个派生类。

在单独的方法中定义事件处理程序,并将取消订阅操作添加到其方法体:

_cefGlueBrowser.LoadEnd -= Browser_LoadEnd;
public EventHandler OnLoadEnd(对象发送方,)
{
BeginInvoke(新操作(()=>
{
MyCefStringVisitor visitor=新的MyCefStringVisitor(此为m_url);
_获取浏览器.Browser.GetMainFrame().GetSource(访问者);
加载=真;
}));
_cefGlueBrowser.LoadEnd-=OnLoadEnd;
}

这是因为我们捕获的是变量(词法闭包),而不是在任何特定时间的变量值。

基于Mark Gra砾响应,我认为您还需要至少一个标志

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

尝试将该方法分配给EventHandler对象。然后分配和取消分配对象。您是否尝试使用普通方法而不是匿名(s,e)=>{…},然后可以在.LoadEnd-=MyMethod中引用该方法?您指的是什么普通方法?很高兴帮助您!请考虑将我的答案标记为-答案。希望知道C是否能够处理注销被调用的函数。这似乎证实了这一点。有通用版本吗?只需知道:此方法不能确保只调用一次事件处理程序;如果有两个线程从那里同时触发事件,则会调用两次处理程序。若要添加此操作,如果使用
Action
Action
Func
,则也可以将它们用作处理程序<代码>操作处理程序=null;(…)如果您担心的是线程,您可能应该使用锁而不是标志。每个线程都有可能同时通过if(done)。
EventHandler handler = null;
obj.SomeEvent += handler = (s, e) => {
    obj.SomeEvent -= handler;
    // more stuff
};
        bool done = false;
        EventHandler eh = null;
        obj.evt += eh = (_, e) => {
            obj.evt -= eh;
            if (done)
                return;
            done = true;

            // stuff
        };