Выполнить веб-запрос в фоновом потоке, когда поток пользовательского интерфейса заблокирован - PullRequest
1 голос
/ 11 декабря 2011

Почему следующий код выполняет веб-запросы через 5 секунд, когда поток пользовательского интерфейса больше не блокируется?Thread.Sleep находится в потоке пользовательского интерфейса, в то время как выполнение и вызов веб-запросов происходит внутри потока из ThreadPool.

Loaded += (sender, args) => {

    for (int i = 0; i < 5; i++) {

        ThreadPool.QueueUserWorkItem(state => {
            var request = WebRequest.CreateHttp("http://google.com");
            request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null);
        });

        Thread.Sleep(1000);
    }

};

Какой код следует написать для выполнения веб-запроса в фоновом потоке во время потока пользовательского интерфейсазаблокирован?

РЕДАКТИРОВАТЬ: ... чтобы быть более конкретным.Почему этот запрос выполняется через 10 секунд, поскольку он находится в фоновом потоке?

Loaded += (sender, args) => {

    ThreadPool.QueueUserWorkItem(state => {
        var request = WebRequest.CreateHttp("http://google.com");
        request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null);
    });
    Thread.Sleep(10000);

};

Ответы [ 2 ]

1 голос
/ 06 сентября 2012

Я задал почти такой же вопрос здесь (который я закрою сейчас, когда нашел ваш): DownloadStringAsync требует потока пользовательского интерфейса?

Ответ заключается в том, что ВСЕ сетьв конечном итоге код передается в поток пользовательского интерфейса в Silverlight до версии 5. К сожалению, даже при сборке с использованием Silverlight 5 я все еще сталкиваюсь с той же проблемой, поэтому продолжаю исследовать ...

0 голосов
/ 11 декабря 2011

Может быть, вы хотите сделать это вместо:

Loaded += (sender, args) =>
{
    ThreadPool.QueueUserWorkItem(dummy =>
    {
        for (int i = 0; i < 5; i++)
        {

            ThreadPool.QueueUserWorkItem(state =>
            {
                var request = WebRequest.CreateHttp("http://google.com");
                request.BeginGetResponse(ar => Debug.WriteLine("Request finished"), null);
            });

            Thread.Sleep(1000);
        }
    });

};

Это совсем не блокирует пользовательский интерфейс, и сообщение отладки приходит каждую секунду. Или каково было бы ваше желаемое поведение? Вы действительно хотите заблокировать пользовательский интерфейс (вы не должны ...)?

РЕДАКТИРОВАТЬ (после редактирования):

Понятно. Это немного нелогично, и у меня нет ответа сразу. Я сильно подозреваю, что запрос требует некоторой активности потока пользовательского интерфейса. Ваш основной поток всегда должен быть отзывчивым и никогда не блокировать, так что это не будет проблемой. Если только вы не заблокируете основной поток. Таким образом, они могли бы избавиться от работы по оптимизации для ошибочного случая (что это такое).

Тем не менее ответ будет интересным. Я знаю из мира настольных компьютеров, что материал, связанный с браузером, нуждается в основной теме. Поэтому я рекомендую больше не блокировать его:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...