Обратные вызовы (асинхронные вызовы методов) внутри цикла - PullRequest
0 голосов
/ 11 октября 2009

Часть приложения на C #, которое я пишу, требует сбора данных из базы данных поставщика услуг для каждой учетной записи, связанной с пользователем. Когда пользователь входит в приложение, вызывается обновить учетные записи из базы данных поставщика услуг. Поскольку многие операции выполняются на стороне третьих лиц, процесс получения их информации может занять некоторое время, поэтому я не хочу ждать, пока каждая учетная запись просто начнет процесс обновления. У меня вопрос, есть ли какие-либо проблемы (может быть, проблемы с потоками) с вызовом асинхронного метода внутри цикла?

Ответы [ 2 ]

5 голосов
/ 11 октября 2009

Единственная проблема, связанная с циклом, состоит в том, что если вы используете анонимные методы, которые ссылаются на переменные цикла, каждый раз вокруг цикла будет создаваться экземпляр объекта анонимного метода, но все они будут ссылаться на одну и ту же переменную цикла, поэтому они увидит, как он изменит свое значение при выполнении цикла. Поэтому сделайте копию переменной цикла внутри цикла.

foreach (var thing in collection)
{
    var copy = thing;

    Action a = () =>
               {
                   // refer to copy, not thing
               }
}

2017-04-25: Кстати, эта проблема была решена в C # 5.0. foreach автоматически выполняет вышеуказанное преобразование.

1 голос
/ 11 октября 2009

Цикл не проблема, но запуск (слишком) многих потоков может быть. Посмотрите, позволяют ли ваши требования использовать ThreadPool .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...