如何退订此lambda事件?

时间:2019-04-11 08:41:43

标签: c# events lambda cefsharp

我正在尝试退订此事件(对于 cefsharp 事件):

wbPrzegladarka.FrameLoadEnd += async (sender, args) =>
{
  //Wait for the Page to finish loading
  if (args.Frame.IsMain)
  {
    await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
   }
 };

在这种情况下,当再次加载页面时,不应再触发它。我不确定如何处理lambda。

编辑:

我尝试过:

EventHandler<FrameLoadEndEventArgs> handlerFrameLoadEnd = async (sender, args) =>
            {
                //Wait for the Page to finish loading
                if (args.Frame.IsMain)
                {
                    await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
                }
            };
            wbPrzegladarka.FrameLoadEnd += handlerFrameLoadEnd;

但是由于某种原因,该事件根本没有触发。

编辑:

还尝试了 Neil的函数事件:

wbPrzegladarka.FrameLoadEnd += FrameLoad;
wbPrzegladarka.FrameLoadEnd -= FrameLoad;

void FrameLoad(object sender, EventArgs args)
{
    //Wait for the Page to finish loading
    if (args.Frame.IsMain)
    {
        args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');").Wait();
    }
}

但是由于某种原因,根本不会触发:/

3 个答案:

答案 0 :(得分:2)

将lambda移至函数中,然后以常规方式订阅/取消订阅委托。

wbPrzegladarka.FrameLoadEnd += FrameLoad;
wbPrzegladarka.FrameLoadEnd -= FrameLoad;

void FrameLoad(object sender, EventArgs args)
{
    //Wait for the Page to finish loading
    if (args.Frame.IsMain)
    {
        args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');").Wait();
    }
}

答案 1 :(得分:2)

将lambda表达式移动到单独的方法中,然后在该方法内退订。

//subscribe
wbPrzegladarka.FrameLoadEnd += FrameLoad;


public async void FrameLoad(object sender, FrameLoadEndEventArgs args)
{
    if (args.Frame.IsMain)
    {
        await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
        //Unsubscribe 
        wbPrzegladarka.FrameLoadEnd -= FrameLoad;
    }
}

答案 2 :(得分:1)

我的最终解决方案是,当我在类中声明一个字段时:

EventHandler<FrameLoadEndEventArgs> handlerFrameLoadEnd;

取消订阅是事件的内部内容

handlerFrameLoadEnd = async (sender, args) =>
{
   //Wait for the Page to finish loading
   if (args.Frame.IsMain)
      await args.Frame.EvaluateScriptAsync("alert('MainFrame finished loading');");
   wbPrzelgadarka.FrameLoadEnd -= handlerFrameLoadEnd;
};

我还需要记住在活动结束后订阅它:

wbPrzegladarka.FrameLoadEnd += handlerFrameLoadEnd;