motkot
@motkot
Программирование C#.

Почему иногда текст 2 раза пишется, а не 1 раз?

Такой прикол. Иногда выводит сразу 2 текста, а не один.

610aa35e3ecd5901616727.png

В коде через дебаг смотрел, вроде не должен. В чем прикол?

Сайт

string html = await browser.GetSourceAsync();

        angle = parser.ParseDocument(html);

        Plaintiffs.Text = string.Empty;

        foreach (IElement element in GetElementsBySelector(PlaintiffsSelector))
        {
             Plaintiffs.Text += element.TextContent.Trim() + "\n\n";
        }

        private List<IElement> GetElementsBySelector(string Selector)
        {
            IElement element = angle.QuerySelector(Selector);
            List<IElement> elements = new List<IElement>();

            int i = 1;

            while(element != null)
            {
                elements.Add(element);

                i++;

                Selector = Selector.Replace((i - 1).ToString(), i.ToString());      

                element = angle.QuerySelector(Selector);
                
            }

            return elements;
        }
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Для решения твоей проблемы тебе нужно написать твой обработчик события загрузки фрейма как показано ниже и убрать отовсюду вызов Invoke. Асинхронные методы на то и возвращают таски, чтобы в том числе можно было работать в UI потоке (основной код писать) и он не зависал.

Если на странице несколько фреймов, то этот обработчик вызовется, когда буде загружен каждый из них
private readonly string url = "https://kad.arbitr.ru/Card?number=";

private void OnWebBrowserFrameLoadEnded(object sender, FrameLoadEndEventArgs e)
{
    Debug.WriteLine($"{nameof(OnWebBrowserFrameLoadEnded)}. " +
                    $"Frame.IsMain: {e.Frame.IsMain.ToString()}; e.Url: {e.Url};");

    if (e.Frame.IsMain && e.Url.Contains(url))
    {
        Invoke((MethodInvoker)(async () =>
        {
            await UpdateData();
        }));
    }
}


Используй логирование, иначе ты так устанешь баги дебажить. Обычно логеры умеют писать в логи номер потока в том числе.

ChromiumWebBrowser.FrameLoadEnd
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы