2011-12-17 2 views
0

Я получаю список соединений, когда-то 70 человек в списке где-то 1000, я помещаю в него цикл и начинаю получать их один за другим с помощью HTTPWEBREQUEST, и у меня есть текстовое поле, которое показывает мне, где я нахожусь, 10-15 или 200 и т. Д.,Путаница с HTTPWEBREQUEST

Моя проблема в том, что у меня есть кнопка остановки на этом, и когда я нажимаю кнопку остановки, я хочу, чтобы она вырвалась из нее, как я могу это достичь?

Непонятно, что делать, когда я нажимаю стоп? Потому что форма (приложение формы окна) застревает/висит до тех пор, пока она не будет завершена ...

Любая помощь приветствуется, Спасибо заранее.

ответ

1

Похоже, что вы выполняете всю работу в потоке пользовательского интерфейса. Вместо этого вы должны либо использовать асинхронные веб-запросы (возможно, используя WebClient) или выполните загрузку в рабочий поток (например, с помощью BackgroundWorker). Таким образом, ваш пользовательский интерфейс будет оставаться отзывчивым, и вы можете иметь какой-то общий флаг, чтобы указать, следует ли продолжать обработку списка. Обратите внимание, что вы захотите либо использовать volatile, либо заблокировать, либо класс Interlocked, чтобы убедиться, что изменения, внесенные в общий флаг в потоке пользовательского интерфейса, видны в рабочем потоке.

Другой альтернативой является использование параллельной библиотеки задач (TPL) из .NET 4 с помощью cancellation token. Это немного более продвинутый, но в конечном итоге будет более чистым.

Обратите внимание, что C# 5 значительно упростит асинхронность.

+0

Я использую HTTPWebRequest, будет ли использовать webclient решить проблему? он не застрянет, как это? – ehsankayani

+0

@ehsankayani: вам нужно работать асинхронно, что проще с WebClient, чем с HttpWebRequest, хотя это возможно * с последним. –

0

Для этой задачи вы должны использовать BackgroundWorker, чтобы ваш пользовательский интерфейс не блокировался. Все длительные операции должны выполняться в другом потоке, чем поток пользовательского интерфейса, чтобы пользовательский интерфейс оставался отзывчивым. Фоновый работник поддерживает отмену с использованием метода CancelAsync().

+0

Вы имеете в виду отдельную тему? – ehsankayani

+0

Да, фоновой рабочий делает свою работу над отдельным потоком – BrokenGlass