Отмена загрузки WebClient

225
23 августа 2017, 14:40

привет есть не большая проблема вот метод для загрузки с URL картинки

public async Task DownloadFile(string adress, Image target)
{
    if (adress == string.Empty)
        return;
    using (var web = new WebClient())
    {
        await web.DownloadFileTaskAsync(new Uri(adress), "Data/" + adress.Substring(adress.LastIndexOf("/")));
        var path = Directory.GetCurrentDirectory() + "/Data/" + adress.Substring(adress.LastIndexOf("/"));
        target.Source = new BitmapImage(new Uri(path));
    }
}

Сделал WebClient локальным, потому что может быть несколько параллельныx загрузок и для каждой свой. Так вот вопрос: как отменить загрузку не конкретном webcliente?

Answer 1

Стандарт для отмены операций в TAP -- это использование CancellationToken. При каждом вызове метода вам нужно передавать свой токен и тогда вы сможете управлять отменой по отдельности.

Однако поскольку WebClient был создан еще до TAP, то поддержку TAP в него добавляли пост-фактум и частично. Одним из ограничений является то, что он не умеет работать с CancellationToken. Но можно воспользоваться следующим трюком:

public async Task DownloadFile(string adress, Image target, CancellationToken token)
{
    if (adress == string.Empty)
        return;
    // регистрируем вызов CancelAsync() как реакцию на отмену токена,
    // using нужен для отмены регистрации после завершения скачивания
    using (var web = new WebClient())
    using (token.Register(web.CancelAsync))
    {
        await web.DownloadFileTaskAsync(new Uri(adress), "Data/" + adress.Substring(adress.LastIndexOf("/")));
    }
    // этот код уже не имеет отношения к WebClient, поэтому лучше вынести его из using
    var path = Directory.GetCurrentDirectory() + "/Data/" + adress.Substring(adress.LastIndexOf("/"));
    target.Source = new BitmapImage(new Uri(path));
}
...
var cts = new CancellationTokenSource();
await DownloadFile(..., ..., cts.Token);
// где-то в другом месте
cts.Cancel();
READ ALSO
Непредвиденное исключение в методе

Непредвиденное исключение в методе

Есть метод для отсечки по времени выполнения асинхронной задачи, выглядит он вот так:

193
It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level

Во время работы в студии все хорошо работает, когда публикую сайт на сервер пишет вот такие ошибки :

185
Горячие клавиши в TreeView

Горячие клавиши в TreeView

Есть TreeView, к которому биндятся команды копирования/вставки/удаления узлов с горячими клавишами

238
Как правильно обновить данные

Как правильно обновить данные

Создал глобальное соединение с БДДалее пытаюсь добавить данные:

163