Доступ к элементам управления через потоки

#c# #multithreading

#c# #многопоточность

Вопрос:

Я использую WebBrowser Control в c # для проверки пары результатов поисковой системы, но иногда без всякой причины он застревает. Моей первой мыслью было сделать каждую функцию поиска потоком и использовать thread.abort () по таймеру, но я просто не мог справиться с элементами управления пользовательского интерфейса (включая веб-браузер), что бы я ни пробовал. У кого-нибудь есть решение для меня? пример был бы отличным, потому что я уже перепробовал так много вещей, и я продолжаю получать все эти исключения.

Комментарии:

1. Что именно вы хотите проверить в этих поисковых системах? Почему вы используете веб-браузер? Разве вы не можете использовать HttpRequest?

Ответ №1:

Я считаю, что вы можете использовать WebRequest в фоновом режиме и избежать трудностей, связанных с моделью потоков COM. Вы можете использовать WebRequest.Время ожидания для обработки всего, что, по вашему мнению, занимает слишком много времени.

Попробуйте что-то вроде этого:

    static void Main(string[] args)
   {
       BackgroundWorker bg = new BackgroundWorker();
       bg.DoWork  = backgroundWorker_DoWork;

       bg.RunWorkerAsync(new List<object> { "http://download.thinkbroadband.com/512MB.zip" });
       while (true) {}
   }

   private static void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
   {
       Console.WriteLine("Starting operation.");
       BackgroundWorker bw = sender as BackgroundWorker;

       List<object> args = (List<object>)e.Argument;

       var url = (string)args[0];
       WebRequest request = WebRequest.Create(url);
       request.Timeout = 300;

       try
       {
           WebResponse response = request.GetResponse();
           Console.WriteLine("Request successful.");
       }
       catch (Exception ex)
       {
           Console.WriteLine("Request timed out.");
       }
   }
  

WebBrowser — это компонент, который следует использовать, когда вы хотите встроить экземпляр IE в свой уровень представления. Если вам это не нужно, вы можете использовать что-то более легкое.

Ответ №2:

Используйте элементы управления .Метод Invoke():http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

Есть и другие методы, которые вы также можете использовать: .BeginInvoke и .EndInvoke для асинхронных вызовов.

 if(control.InvokeRequired)
{
    control.Invoke(control.delegate);
}