Вы должны позвонить startDownload()
из потока пользовательского интерфейса. Идея WebClient.DownloadFileAsync()
заключается в том, что он автоматически создаст для вас рабочий поток, не блокируя вызывающий поток. В startDownload()
вы указали обратные вызовы, которые изменяют элементы управления, которые, как я полагаю, были созданы потоком пользовательского интерфейса. Таким образом, если вы вызовете startDownload()
из фонового потока, это вызовет проблемы, поскольку поток может изменять только созданные им элементы пользовательского интерфейса.
Способ, которым он должен работать, заключается в том, что вы вызываете startDownload()
из потока пользовательского интерфейса, startDownload()
, так как вы определили, что он устанавливает обратные вызовы событий, которые обрабатываются потоком пользовательского интерфейса. Затем он начинает загрузку асинхронно и сразу же возвращается. Поток пользовательского интерфейса будет уведомлен об изменении хода выполнения, и код, отвечающий за обновление элемента управления индикатором выполнения, будет выполнен в потоке пользовательского интерфейса, и проблем быть не должно.