Как использовать таймер с веб-браузером в консольном приложении на 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] основного метода, но я случайно не вставил код выше. Я хочу знать, какова его роль здесь?