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