Запуск потока в цикле по таймеру, выполняющий только последний поток в указанном цикле. - PullRequest
1 голос
/ 08 сентября 2011

У меня есть таймер, выполняющий цикл, выполняющий серию потоков.Каждый поток просто опрашивает последовательное устройство (на уникальных портах) и записывает данные в базу данных MySQL для захвата веб-приложением.

Я заметил, что выполняется только последний поток в цикле.

Вот мой метод таймера Interval.

static void glob_timer_Elapsed(object sender, ElapsedEventArgs e)
{
    foreach (object[] row in user_ids)
    {
        Console.WriteLine(row[0].ToString() + ":" + row[1].ToString());
        ThreadStart starter = delegate { Functions.UpdateFor(row[0].ToString(), row[1].ToString()); };
        new Thread(starter).Start();
    }
}

user_ids - это List<object[]>, содержащий строки из запроса;так row[0] = идентификатор пользователя , row[1] = Имя Com-порта

В функции UpdateFor():

public static void UpdateFor(string uid, string com_name)
{
    try
    {
        Console.WriteLine("[" + uid + "]- " + DateTime.Now.ToString() + " : " + "Begin read transmission.");

Когдаэто запускается, в консоли я вижу

 1:COM1 
 2:COM2
 [2]-{DateTime} : Begin read transmission

Почему я не вижу UpdateFor для uid 1.

Примечание: я также проверил данные, которые должны бытьзаписано в БД из COM1 никогда не пишется.

1 Ответ

5 голосов
/ 08 сентября 2011

Вы страдаете от проблемы закрытия. Каждый делегат захватывает ссылку на object[] row в каждой итерации цикла, таким образом, все они выполняются с одной и той же ссылкой, а именно, каким бы ни было значение строки в итоге. Вам нужно просто назначить внутреннюю переменную, чтобы каждый делегат получал уникальную ссылку.

 foreach (object[] row in user_ids)
 {
    var innerReference = row;
    Console.WriteLine(innerReference[0].ToString() + ":" + innerReference[1].ToString());
    ThreadStart starter = delegate { Functions.UpdateFor(innerReference[0].ToString(), innerReference[1].ToString()); };
    new Thread(starter).Start();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...