WebClient. DownloadDataAsync замораживает мой UI

попробуйте эту функцию, чтобы преобразовать формат времени, как вам требуется

timeFormetChange(){
 var date =new Date();
 var newDate = date.getDate();
 var newMonth = date.getMonth();
 var newYear =date.getFullYear();
 var Hour = data.getHours();
 var Minutes = data.getMinuets();
 return `${newDate}-${newMonth }-${newYear} ${Hour}:${Minutes }`
}
6
задан Jon Skeet 7 November 2008 в 12:38
поделиться

13 ответов

Теперь, когда у нас есть полный код, я могу сказать, что определенно не вижу проблемы - не совсем, как описано, так или иначе.

У меня есть немного входа для указания незадолго до и после вызовов DownloadDataAsync, и когда завершенный обработчик запущен. Если я загружаю большой файл по 3G, существует пауза между "прежде" и "после" но UI подходит возрасты, прежде чем файл завершит загрузку.

У меня есть подозрение, что подключение сделано синхронно, но фактическая загрузка является асинхронной. Это все еще неудачно, конечно - и возможно плывущий на плоскодонке, все это в другой поток является способом пойти - но если я прав, что об этом, по крайней мере, стоит знать.

4
ответ дан 8 December 2019 в 14:48
поделиться

Ummm.... Мне просто любопытно

У Вас есть какие-либо Брандмауэры на?

какие-либо брандмауэры вообще на Вашей машине?

Возможно, ZoneAlarm?

0
ответ дан 8 December 2019 в 14:48
поделиться

Я попробовал Ваш код, и он хорошо работает.

Могли Вы отправлять свое Основное (Args []) метод и значение a и b, когда это будет выполнено:

    int a, b;
    ThreadPool.GetMaxThreads(out a, out b);

Я попробовал его в.NET 3.5 и VS2008. Я в замешательстве, но я убежден, что это относится к установке на Вашей машине. Не код. Проверьте эти вещи:

  • Проверьте пул потоков (выше). Я получаю a=250 b=1000
  • Отключите все сторонние плагины
  • Загрузитесь "Чистый" VS (Перезагрузите Вас),
  • Близко столько программ/сервисов, сколько Вы можете
  • Проверьте свою конфигурацию IE. Я думаю, что класс использует код IE
  • Брандмауэр? AntiVirus?
  • Попробуйте его на другом компьютере
0
ответ дан 8 December 2019 в 14:48
поделиться

Я могу выполнить Ваш прекрасный код. И форма обнаруживается, и загрузка завершается ПОСЛЕ ТОГО, КАК форма обнаружилась.

У меня нет замораживаний, как Вы упомянули.

Я думаю, что это имеет некоторое отношение к среде, Вы выполняете его внутри.

На какой версии.NET/Visual Studio Вы?

0
ответ дан 8 December 2019 в 14:48
поделиться

Использование () оператор пытается звонить, Располагают () WebClient, в то время как это все еще загружает. Расположить метод, вероятно, ожидает загрузки для окончания перед продолжением.

Попытайтесь не использовать использование () оператор и избавьтесь от WebClient в своем событии DownloadDataCompleted.

0
ответ дан 8 December 2019 в 14:48
поделиться

DownloadDataAsync по сравнению с DownloadData в потоке неUI:

DownloadDataAsync хорош, потому что он на самом деле не связывает поток до обработки DownloadDataCompletedEvent, после того, как запрос был выполнен, и сервер отвечает.

Я полагаю, что Jon Skeet на правильном пути - я читал, то разрешение DNS должно завершиться синхронно, прежде чем асинхронный Запрос HTTP стоится в очереди и возвраты вызова DownloadDataAsync.

Разрешение DNS могло быть медленным?

1
ответ дан 8 December 2019 в 14:48
поделиться

Это выглядит немного странным мне.

Попытайтесь сохранить участника касательно WebClient, таким образом, Вы не уничтожаете его в конструкторе, возможно, он блокируется на клиенте. Расположите ()

0
ответ дан 8 December 2019 в 14:48
поделиться

ВОССТАНОВЛЕННЫЙ ПОСЛЕ УДАЛЕНИЯ: Как многие думают о блоке использования как, я делаю, я подтвердил, что он не связан.

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

1
ответ дан 8 December 2019 в 14:48
поделиться

Я сильно подозреваю, что это относится к избавлению от WebClient при тихом использовании его для асинхронного вызова.

Попытайтесь удалить оператор использования, и вызов Располагает в обработчике событий вместо этого. (Или только для тестирования, не волнуйтесь о расположении его вообще.

Если Вы могли бы отправить короткую, но полную программу, которая демонстрирует проблему, которая была бы действительно удобна.

1
ответ дан 8 December 2019 в 14:48
поделиться

А также избавление от чего-то, что возможно все еще выполняет асинхронный вызов, это было упомянуто другими людьми, я Настоятельно рекомендую против выполнения тяжелого материала как это в конструкторе формы.

Сделайте это в переопределении OnLoad вместо этого, где Вы также сможете проверить свойство DesignMode, которое поможет Вам избежать нескольких уровней ада с конструктором форм VS.

1
ответ дан 8 December 2019 в 14:48
поделиться

Вы хотите выполнить загрузку в другом потоке, рассматривать это как начальную точку.

1
ответ дан 8 December 2019 в 14:48
поделиться

По моему опыту, он блокирует поток при отладке проекта (запуск внутри Visual Studio) и при первом доступе к серверу.

При запуске скомпилированного exe блокировка не заметна.

0
ответ дан 8 December 2019 в 14:48
поделиться

Я только что протестировал то же самое в проекте WPF под VS2010, .NET 4.

Я загружаю файл с индикатором выполнения, чтобы показать процент выполнения с помощью WebClient.DownloadDataCompleted и т.д.

И, к моему удивлению, я обнаружил то же самое, о чем говорил @Dan: В отладчике он блокирует поток забавным образом. В отладке мой счетчик прогресса обновляется на 1%, затем некоторое время ничего не делает, а затем снова обновляется на 100%. (Отчеты Debug.WriteLn печатаются без проблем). И между этими двумя моментами пользовательский интерфейс застывает.

Но вне отладчика индикатор выполнения плавно перемещается от 0% до 100%, и пользовательский интерфейс никогда не замирает. Что и следовало ожидать.

1
ответ дан 8 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: