2015-06-21 2 views
-1

У меня есть вид списка изображений. В зависимости от ключевого слова пользователя список фильтруется, а уточненный список добавляется в качестве источника списка. Как только источник добавлен, я использую метод Async/Await для загрузки изображений в список из Интернета.Создать Async Ожидание очереди в C# windows Phone 8.1

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

Это то, что я хочу. Мне нужно создать очередь асинхронных вызовов размера, например 5. при добавлении шестого вызова. Он должен отменить первый асинхронный вызов и добавить в очередь.

+2

Вам даже нужна очередь? Возможно, вам просто нужно отменить все задачи загрузки, которые больше не нужны в новом списке. – usr

+0

Это мой второй вариант, если описанный выше сценарий невозможен. Можете ли вы объяснить мне, как отменить все предыдущие вызовы при добавлении нового списка? –

+0

Используйте «CancellationToken». –

ответ

0

Вам не нужна очередь; поскольку каждое ключевое слово заменяет предыдущее, вам нужно только одну загрузку за один раз.

Это может быть выполнено с использованием CancellationTokenSource. Вот один пример:

private CancellationTokenSource _cts; 
private async Task RefreshListAsync(string keyword) 
{ 
    if (_cts != null) 
    _cts.Cancel(); 
    _cts = new CancellationTokenSource(); 
    var result = await DownloadListAsync(keyword, _cts.Token); 
    _cts.ThrowIfCancellationRequested(); 
    MyList = result; 
} 
+0

- Стивен Клири. К сожалению, предыдущий вызов не отменяется. Я использовал ваш подход только. –

+0

@AasiqDx: Вы должны соблюдать токен в 'DownloadListAsync'. Обычно это делается путем передачи маркера любому объекту, выполняющему сетевой вызов. –

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