Nithin B Ответов: 2

Как использовать таймер с веб-браузером в консольном приложении на C#?


Я пытаюсь загрузить несколько url-адресов один за другим и использую функцию timer.tick, чтобы все данные ajax загружались на веб-страницу.

1. но проблема в том, что консольное приложение закрывается до таймера. тик-это вызов после интервала таймера, потому что таймер имеет новый поток?

Примечание****: Я также использую [STAThread] для основного метода, потому что если я его не использую, он показывает предупреждение о том, что файл .pdb не загружен

2. какова здесь роль [STAThread]?

Как решить эту проблему. Есть ли какой-нибудь способ заставить его ждать, пока таймер не остановится? Вот примеры кода ниже.

static void Main(string[] args)
    {
        OpenURLInBrowser("https://www.google.co.in/");
    }
private static void OpenURLInBrowser(String url)
    {
        if (!url.StartsWith("http://") && !url.StartsWith("https://"))
        {
            url = "http://" + url;
        }
        try
        {
            webbrowser.AllowNavigation = true;
            webbrowser.ScriptErrorsSuppressed = true;
            webbrowser.Navigate(new Uri(url));
            WaitTillPageLoadsCompletly(DynamicWebBrowser.webbrowser);
            timer.Interval = 10000;
            timer.Tick += Timer_Tick;
            timer.Start();
        }
        catch (UriFormatException)
        {
            return;
        }
    }
    private static void Timer_Tick(object sender, EventArgs e)
    {
        if (webbrowser.ReadyState == WebBrowserReadyState.Complete)
        {
            HtmlElement element = webbrowser.Document.GetElementById("loadingDiv");
            if (element != null)
            {
                Console.Write(element.OuterHtml + "\n\n\n");
                Console.WriteLine("==============================================================================================================" + "\n\n\n");
                timer.Stop();
                int count = 0;
                while (count < 2)
                {
                    OpenURLInBrowser("https://www.google.co.in/");
                    count++;
                }
            }
        }
    }
private static void WaitTillPageLoadsCompletly(WebBrowser webBrControl)
    {
        WebBrowserReadyState loadStatus;
        int waittime = 20000;
        int counter = 0;
        while (true)
        {
            loadStatus = webBrControl.ReadyState;
            Application.DoEvents();
            if ((counter > waittime) || (loadStatus == WebBrowserReadyState.Uninitialized) || (loadStatus == WebBrowserReadyState.Loading) || (loadStatus == WebBrowserReadyState.Interactive))
            {
                break;
            }
            counter++;
        }
        counter = 0;
        while (true)
        {
            loadStatus = webBrControl.ReadyState;
            Application.DoEvents();
            if (loadStatus == WebBrowserReadyState.Complete && webBrControl.IsBusy != true)
            {
                break;
            }
            counter++;
        }
    }


Что я уже пробовал:

Приведенный выше код - это то, что я пробовал.

[no name]

1. его выход, потому что ваш основной метод закончил работу. Когда главный выходит, то же самое делает и ваше приложение.
2.в вашем коде нет [STAThread], но если бы он был, это делает ваш основной поток квартирой с одним потоком. Простой поиск в google сказал бы вам об этом.

Nithin B

Да, у меня есть [STAThread] основного метода, но я случайно не вставил код выше. Я хочу знать, какова его роль здесь?

2 Ответов

Рейтинг:
2

Dave Kreskowiak

У вас нет не только потока STA, но и насоса сообщений, без которого управление WebBrowser не будет работать правильно.

Видеть этот[^].


Рейтинг:
1

manu_dhobale

Да, в вашем коде нет потока STA. если вы ставите таймер, чтобы получить время для загрузки html-кода, это не требуется при использовании события document completed

Пожалуйста, попробуйте это

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApplication1
{
    class Program
    {

        public static void Main(string[] args)
        {
            string url = "https://www.google.co.in/";
            Thread thread = new Thread(delegate ()
             {
                 using (WebBrowser browser = new WebBrowser())
                 {
                     browser.ScrollBarsEnabled = false;
                     browser.AllowNavigation = true;
                     browser.Visible = true;
                     browser.Navigate(url);
                     browser.Width = 1024;
                     browser.Height = 768;
                     browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);


                     while (browser.ReadyState != WebBrowserReadyState.Complete)
                     {
                         System.Windows.Forms.Application.DoEvents();
                     }
                 }
             });
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
            Console.ReadKey();
        }


        public static void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            WebBrowser webBrControl = sender as WebBrowser;
            if (webBrControl.ReadyState == WebBrowserReadyState.Complete)
            {
                HtmlElement element = webBrControl.Document.GetElementById("prm");
                if (element != null)
                {
                    Console.Write(element.OuterHtml + "\n\n\n");
                    Console.WriteLine("==============================================================================================================" + "\n\n\n");
                }
            }
        }
    }
}