0

Есть форма, на форме расположен WebBrowser. С основного потока создаю несколько дополнительных:

    IProgress<string> progress;
    SemaphoreSlim semaphore;
    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        progress = new Progress<string>(s => WorkLog.Text += s + Environment.NewLine);
        try
        { 
            ObservableCollection<TaskTable> _devices = new ObservableCollection<TaskTable>();
        int maxConcurrency = 10; // сколько одновременно может работать потоков
        using ( semaphore = new SemaphoreSlim(maxConcurrency))
        {
            List&lt;Task&gt; tasks = new List&lt;Task&gt;();

            for (int i = 0; i &lt; MyCollection.Count; i++)
            {
                int id = i;
                await semaphore.WaitAsync(); // ждать, если максимальное количество уже работает, пока потоков не станет меньше

                tasks.Add(Task.Run(() =&gt;
              {

                AddPost(progress, id, semaphore);
              }));

            }
            await Task.WhenAll(tasks); // ждать завершения всех
        }

    }
    catch(Exception ex)
    {
        progress.Report(&quot;Ошибка в Button_Click&quot;);
    }

}

Мне нужно что бы из метода AddPost(progress, id, semaphore); можно было обратиться к WebBrowser, передать ему URL страницы которую нужно загрузить и получить HTML ответ.

Пробавал передавать методу AddPost WebBrowser:

AddPost(progress, id, semaphore, WebBrowser1);

И далее в AddPost обращаться к браузеру:

 WebBrowser1.Navigate(Url);

Но форма все равно зависает.

Не использую httpClient потому что перед отправкой запроса нужна предварительная авторизация, для меня реализовать оказалось слишком сложно.

Как нескольким потокам можна обращаться к WebBrowser и получать HTML загруженой страницы?

Спасибо

WyWyWy
  • 55
  • 6
  • 2
    WebBrowser это ерунда, которая способна лишь отобразить простенькую страничку. Авторизация, это запросы, cookie, ключи и все в этом духе. Хотите браузер - используйте полноценные движки, но мой вам совет, попробуйте проанализировать сайт, понять, как он работает, что отправляет, а затем попробуйте это все отправить простыми запросами, в большинстве случаев этого достаточно! – EvgeniyZ Feb 07 '21 at 20:29
  • Возможно дубликат https://ru.stackoverflow.com/questions/418461/%d0%a0%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d0%b0%d0%bc%d0%b8-%d0%b8%d0%b7-%d1%84%d0%be%d0%bd%d0%be%d0%b2%d0%be%d0%b3%d0%be-%d0%bf%d0%be%d1%82%d0%be%d0%ba%d0%b0 – Pavel Popov Feb 07 '21 at 20:31
  • @EvgeniyZ, Мне и нужно всего навсего отобразить страницу. Это instagram, мне нужно получить список постов в аккаунте, получить их можно отправив запрос с параметром ?__a=1, пример: https://www.instagram.com/zuck/?__a=1 Но instagram через раз просит предварительно авторизироваться, а с их авторизацией разобраться не получилось – WyWyWy Feb 07 '21 at 20:43
  • нужна предварительная авторизация https://ru.stackoverflow.com/a/1217351/373567 – aepot Feb 07 '21 at 22:32
  • WebBrowser - это Internet Explorer 11, он несовместим с интернетом, вы просто пока еще этого не поняли. Используйте WebView2 или CefSharp, если уж вам так нужен браузер и без него никак. – aepot Feb 07 '21 at 22:35
  • А если в лоб вашу проблему решать (которая на самом деле - самый настоящий дедлок), то можно вот такое испробовать Dispatcher.Invoke(() => WebBrowser1.Navigate(Url)); – aepot Feb 07 '21 at 22:38

0 Answers0