Как отписаться от этого лямбда-события? - PullRequest
2 голосов
/ 11 апреля 2019

Я пытаюсь отписаться от этого события (для события 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');");
   }
 };

В этом случае, когда страница будет загружена снова, больше не должен запускаться. Я не уверен, как бороться с лямбдами.

EDIT:

Я пробовал это:

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;

Но событие вообще не вызвано, по какой-то причине.

EDIT:

Также пробовал Функциональное событие Нейла :

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 ]

2 голосов
/ 11 апреля 2019

Переместите лямбда-выражение в отдельный метод и отмените подписку внутри метода.

//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 голосов
/ 11 апреля 2019

Мое окончательное решение, когда я объявляю внутри класса поле:

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;
2 голосов
/ 11 апреля 2019

Перемещение лямбда-функции в функцию, а затем обычная подписка / отмена подписки делегата.

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();
    }
}
...