2015-01-21 5 views
0

В моем проекте у меня есть раздел для загрузки файла. Я использую DownloadFileAsync() метод для загрузки и добавить два обработчика событий:Как заблокировать главную тему при использовании DownloadFileAsync

  • DownloadProgressChanged

  • DownloadFileCompleted

Я хочу, когда использование DownloadFileAsync для загрузки файла, блок основного потока, потому что я не» t хотят, чтобы пользователи могли нажимать кнопку до завершения загрузки.

Часть моего кода:

WebClient webClient = new WebClient(); 
     webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChange); 
     webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
     Uri Url = new Uri(txtUrl.Text.Trim()); 
     webClient.DownloadFileAsync(Url,FolderDialog.SelectedPath+System.IO.Path.GetFileName(txtUrl.Text)); 

Как я могу это сделать? Я искал в Интернете, но я не нашел полезного результата. спасибо

+5

Блокировка всего пользовательского интерфейса, чтобы отключить определенную кнопку, кажется ... тяжелой рукой. – spender

+3

... и на самом деле это не то, что вам следует делать с учетом UX. Просто отключите кнопку, поэтому пользователь знает, что он не может ее щелкнуть. Кроме того, нет смысла извлекать ваши данные асинхронно, если вы блокируете поток, ожидая его завершения. Синхронизация синхронно приведет к почти одному и тому же. – Padarom

ответ

6

Лучше отключить элементы управления, чем намеренно блокировать поток пользовательского интерфейса. В Windows Forms это можно сделать, установив Control.Enabled в false. Я не знаком с WPF, поэтому не могу сказать, что вы там делали. В любом случае, отключение элементов управления приводит к желаемому поведению, не останавливая нормальную обработку событий, поэтому пользователь все равно может перемещать окно, он все равно будет перерисовываться и т. Д.

2

Вам действительно не нужно отключать всю цепочку , просто отключите кнопку. Если вы действительно хотите отключить основной поток, просто вызовите thread.sleep, но это победит цель загрузки async, так как конечный результат совпадает с загрузкой.

0

Как уже сказано, в моем опыте общий способ сделать это:

  1. Кнопка отключена перед тем делать какие-либо загрузки.
  2. Загрузка начинается.
  3. Загрузка обработчика события завершения события снова включает кнопку.
  4. Кроме того, в случае возникновения проблемы кнопка должна быть включена.
+1

Учитывая, что вы знаете, что другие уже сказали это, почему вы снова это сказали *? – Servy

+0

@Servy Я чувствовал, что могу немного поработать над завершающими шагами, а не просто указывать OP, чтобы отключить кнопку. Но спасибо, что напомнили мне, почему я не беспокоюсь о том, чтобы внести свой вклад в это дело, я вернусь к ответам. –

Смежные вопросы