c # WebClient DownloadFileAsync () не выдает ошибок - PullRequest
0 голосов
/ 12 сентября 2018

Я успешно загружаю файлы с кодом ниже. Поскольку я хочу, чтобы они загружались при запуске приложения, я не хочу ничего блокировать -> async.

Однако я сталкиваюсь с проблемой, что даже когда полный путь по URI является бессмысленным, он генерирует мне пустой файл, а не вызывает ошибку, как указано в msdn

Кто-нибудь может мне помочь?

private void DownloadDocuments()
    {
        using (WebClient myWebClient = new WebClient())
        {
            try
            {
                Log("load1");
                myWebClient.DownloadFileAsync(new Uri(documentsUri + documentActivation), documentspath + "\\" + documentActivation);

            }
            catch (WebException)
            {
                Log("Guide Activation Download failed.");
            }
            catch (InvalidOperationException)
            {
                Log("Guide Activation could not be saved.");
            }
        }
        using (WebClient myWebClient = new WebClient())
        { 
            try
            {
                Log("load2");
                myWebClient.DownloadFileAsync(new Uri(documentsUri + documentFloating), documentspath + "\\" + documentFloating);
            }
            catch (WebException)
            {
                Log("Guide Floating Download failed.");
            }
            catch (InvalidOperationException)
            {
                Log("Guide Floating could not be saved.");
            }
        }
        using (WebClient myWebClient = new WebClient())
        {
            try
            {
                Log("load3");
                myWebClient.DownloadFileAsync(new Uri(documentsUri + documentSeat), documentspath + "\\" + documentSeat);
            }
            catch (WebException)
            {
                Log("Guide Seat Download failed.");
            }
            catch (InvalidOperationException)
            {
                Log("Guide Seat could not be saved.");
            }
        }
    }

1 Ответ

0 голосов
/ 12 сентября 2018

WebClient.DownloadFileAsync не выдает исключений при сбоях HTTP-запроса. Вам нужно подписаться на событие DownloadFileCompleted , чтобы получать уведомления об ошибках.

Однако я не рекомендую возиться с обратными вызовами обработчиков событий, когда у нас есть функция асинхронного / ожидающего выполнения в C #: WebClient.DownloadFileTaskAsync гораздо удобнее в использовании.

Имея в виду ваш комментарий о параллельной обработке, вы можете сделать что-то вроде этого:

static async Task DownloadDocumentAsync(Uri uri, string fileName)
{
    using (var webClient = new WebClient())
    {
        try
        {
            await webClient.DownloadFileTaskAsync(uri, fileName);
        }
        catch (WebException ex)
        {
            Log($"Downloading {uri} failed. {ex.Message}");
            throw;
        }
        catch (InvalidOperationException)
        {
            Log($"Saving {uri} to {fileName} failed. File is in use.");
            throw;
        }
    }
}

Тогда ваша логика при запуске приложения:

var baseUri = new Uri(documentsUri);
var downloadTasks = new[]
{
    DownloadDocumentAsync(new Uri(baseUri, documentActivation), Path.Combine(documentspath, documentActivation)),
    DownloadDocumentAsync(new Uri(baseUri, documentFloating), Path.Combine(documentspath, documentFloating)),
    DownloadDocumentAsync(new Uri(baseUri, documentSeat), Path.Combine(documentspath, documentSeat)),
};

try
{
    Task.WaitAll(downloadTasks);
}
catch (AggregateException)
{
    // handle the case when some of the download tasks failed
}

Таким образом, задачи загрузки выполняются параллельно, но Task.WaitAll блокируется, пока все задачи не будут выполнены. Если вы хотите остаться в асинхронном режиме, вам нужно await Task.WhenAll.

...