1

Выдает ошибку:

System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа 
к элементу управления 'Plaintiffs' не из того потока, в котором он был создан."

В чем прикол?

Начало появляться после добавления if(node != null), но мне это нужно, без него может появиться ошибка, что нету такого xpath'a.

Код:

using System;
using CefSharp;
using HtmlAgilityPack;
using CefSharp.OffScreen;
using System.Windows.Forms;
using System.Threading;

namespace WinFormsApp1 {

public partial class Form1 : Form
{
    private ChromiumWebBrowser browser;
    private string html;

    public Form1()
    {
        InitializeComponent();
        InitializeChromium();

        browser.FrameLoadEnd += WebBrowserFrameLoadEnded;
    }


    private void WebBrowserFrameLoadEnded(object sender, FrameLoadEndEventArgs e)
    {
        if (e.Frame.IsMain)
        {
            MessageBox.Show("РАБОТАЕМ!");
            browser.ViewSource();
            browser.GetSourceAsync().ContinueWith(taskHtml =>
            {
                html = taskHtml.Result;
                Parce();
            });
        }
    }


    private void button1_Click(object sender, EventArgs e)
    {
        browser.Load($"https://kad.arbitr.ru/Card?number={textBox1.Text}");
    }

    private void InitializeChromium()
    {

        CefSettings settings = new CefSettings();
        Cef.Initialize(settings);
        browser = new ChromiumWebBrowser("https://kad.arbitr.ru");
       // Controls.Add(browser);
       // browser.Dock = DockStyle.Fill;
    }

    private void Parce()
    {
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//*[@id='gr_case_partps']/table/tbody/tr/td[1]/div/ul/li/span/a");
            if(node != null)
            {
            node = doc.DocumentNode.SelectNodes("//*[@id='gr_case_partps']/table/tbody/tr/td[1]/div/ul/li/span/a");
            Plaintiffs.Text = "Истцы:\n" + node[0].InnerText.Replace(" ", ""); // ТУТ ОШИБКА

            node = doc.DocumentNode.SelectNodes("//*[@id='gr_case_partps']/table/tbody/tr/td[2]/div/ul/li/span/a");
            defendant.Text = "Ответчики:\n" + node[0].InnerText.Replace(" ", "");

            node = doc.DocumentNode.SelectNodes("//*[@id='chrono_list_content']/div/div/div[1]/div[2]/h4/span[2]/span/a");
            judje.Text = "Суд:\n" + node[0].InnerText.Replace(" ", "");
            }

    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Cef.Shutdown();
    }
}

}

aepot
  • 49,560
  • browser.GetSourceAsync().ContinueWith — а почему не await? – VladD May 30 '21 at 20:09
  • 1
    https://ru.stackoverflow.com/search?q=%D0%BD%D0%B5+%D0%B8%D0%B7+%D1%82%D0%BE%D0%B3%D0%BE+%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%2C+%D0%B2+%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%BC+%D0%BE%D0%BD+%D0%B1%D1%8B%D0%BB+%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD – tym32167 May 30 '21 at 20:30
  • 1
    https://ru.stackoverflow.com/q/418461/220553 – EvgeniyZ May 30 '21 at 20:50

1 Answers1

2

Это абсолютно никак не связанно с if(node != null).

Вам выдаёт ошибку из-за того, что вы пытаетесь присвоить текст контролу из другого потока (вы вызываете функцию Parse в потоке, полученным от браузера).

Что бы исправить это, вы можете принудительно присвоить текст из нужного потока, а то-есть потока формы. Для этого нужно использовать метод Invoke() формы. Это можно сделать так:

this.Invoke(new Action(() => Plaintiffs.Text = "Истцы:\n" + node[0].InnerText.Replace(" ", "")));

Можно вынести это в отдельную функцию, например так:

private void SetTextToControl(Control control, string text)
{
    this.Invoke(new Action(() => control.Text = text));
}

И затем использовать так:

SetTextToControl(Plaintiffs, "Истцы:\n" + node[0].InnerText.Replace(" ", ""));
iikuzmychov
  • 3,092
  • 1
    Лучше наверное использовать каст делегата вместо создания new экшна this.Invoke((Action)(() => control.Text = text));. – aepot May 30 '21 at 20:49
  • 1
    @aepot возможно, но я не думаю, что будет какая-то существенная разница – iikuzmychov May 30 '21 at 21:28