2012-03-10 2 views
0

Следующий код не работает, как-то я не могу получить значение Int из «завершенного» метод мой метод btn_Start_Click:Открыть файл после завершения загрузки

private void btn_Start_Click(object sender, EventArgs e) 
{ 
    int completedDownload = 0;  

    WebClient webClient = new WebClient(); 
    webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
    webClient.DownloadFileAsync(new Uri("http://somesite.com/file.jpg"), @"c:\file.jpg"); 

    if (Completed.completeDownload == 1) 
    { 
     //open the file code goes here. 
    } 

    //Rest of the code goes here. 
    //and here 
    //and here 
} 

private void Completed(object sender, AsyncCompletedEventArgs e) 
{ 
    completedDownload = 1; 
} 
+1

"Асинхронный" означает "происходит позже". Переместите весь код, который у вас есть после вызова DownloadFileAsync, к методу Completed. Помните, что Completed вызывается потоком threadpool, вам нужно использовать Control.BeginInvoke() для запуска любого кода, который обновляет пользовательский интерфейс. –

ответ

2

Из замечаний о функции WebClient.DownloadFileAsync:

Файл загружается асинхронно с использованием потоков ресурсов, которые автоматически выделяются из пула потоков. Чтобы получить уведомление , когда файл доступен, добавьте обработчик события в событие DownloadFileCompleted.

MSDN Documentation

Похоже, лучший выбор, чтобы огонь функцию, когда файл будет завершено будет включать с помощью обработчика событий. Ниже приведен пример использования DownloadFileCompleted обработчика:

// Sample call : DownLoadFileInBackground2 ("http://www.contoso.com/logs/January.txt"); 
public static void DownLoadFileInBackground2 (string address) 
{ 
    WebClient client = new WebClient(); 
    Uri uri = new Uri(address); 

    // Specify that the DownloadFileCallback method gets called 
    // when the download completes. 
    client.DownloadFileCompleted += new AsyncCompletedEventHandler (DownloadFileCallback2); 
    // Specify a progress notification handler. 
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback); 
    client.DownloadFileAsync (uri, "serverdata.txt"); 
} 

MSDN Documentation

1

Заполненная обработчик выполняется асинхронно. Когда вы проверяете этот int, нет гарантии, что hanlder установил значение. Если вы хотите выполнить какое-либо действие после завершения загрузки, сделайте это в методе Completed.

+0

«Проблема» в том, что я хочу запустить весь свой код под 1 методом, а именно «btn_Start_Click», так что это не вариант в моем случае. – naaitsab

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