отслеживание прогресса нескольких асинхронных вызовов - PullRequest
1 голос
/ 18 января 2012

Существует метод, который получает ответ сервера с

var response = (HttpWebResponse)await request.GetResponseAsync();

Есть дополнительный код для настройки запроса. Я завернул это в асинхронный метод. Этот метод принимает URL в качестве параметра. Вызов этого метода снова оборачивается методом, который создает фактический URL.

Представьте, что последний метод называется следующим образом:

string resultString = await GetResultString(parameter);

Тогда возникла следующая проблема: Я хочу отправить несколько запросов одновременно. У меня есть список параметров. Я сделал это так:

var tasks = new List<Task<string>>();
foreach(parameter in parameters)
{
    tasks.Add(GetResultString(parameter));
}
List<string> resultStrings = await TaskEx.WhenAll(tasks);

Это тоже отлично работает. Но количество запросов является переменным. Так что это может быть 10 запросов. Но также возможно, что вы запускаете 10.000 запросов или даже 100.000. Поэтому я подумал о мониторинге прогресса в индикаторе выполнения. Но как я мог это сделать? Я уже посмотрел на этот фрагмент кода, но я не могу понять, как я мог бы использовать это для своего кода. Мне нужно поднять событие, каждый раз, когда задача завершена. Но как, когда нет никакого обратного вызова, когда задача завершена?

Спасибо и всего наилучшего

PS: может кто-нибудь сказать мне, как использовать для копирования и вставки кода, не ставя четыре пробела перед каждой строкой кода? Я не мог получить никакой помощи от продвинутой помощи. Я просто не могу заставить это работать. И мне жаль, что мой английский не слишком совершенен. Я немец. : -)

Ответы [ 2 ]

0 голосов
/ 19 января 2012

@ McKay и craig1231: Вы были правы.Код, который я предоставил в ссылке, был в порядке, за исключением того, что там использовался старый AsyncCtpLib (ну, пост был выпущен в конце 2010 года).Код нужно немного переделать.Но я решил эту проблему еще до того, как задал этот вопрос здесь.

Моя проблема заключалась в том, что я не понимал, когда ProgressChangedEvent был поднят.Progress<T>, а не EventProgress<T>, так как новый AsyncCtpLib выпускает], он захватывает SynchronizationContext текущего потока.Затем каждый раз, когда Report вызывается изнутри метода TAP, он вызывает событие ProgressChanged в правом потоке.

Ответ был тут же.Но все равно спасибо.:)

0 голосов
/ 18 января 2012

Ну, во-первых, вы должны спросить себя, что вы хотите. Если у вас есть 10 000 запросов, и вы действительно можете их правильно ожидать, то все они выполняются. В данном конкретном случае вы не знаете, как выполняется каждая задача, сколько всего задач выполнено.

Если у вас есть 5 задач, то график выполнения может выглядеть следующим образом:

0 ------------------------------------------ 1-23- 4 --- 5

Хотите сказать, что 1/5 выполнено? Кажется, 1/5 вводит в заблуждение, потому что вы, вероятно, почти закончили?

Но кроме этого, ссылка, которую вы упомянули , должна охватывать то, что вы хотите. Почему это не сработало?

...