#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);
}