Chaitanya Kulkarni Ответов: 1

Мне нужна помощь, чтобы получить выполнение многопоточности в службе windows


Я пытаюсь выполнить тот же класс в службе windows, используя многопоточность.
У меня есть куча записей, и они выполняются службой несколько раз.
Я пробую различные методы, но только последний поток выполняется.

1. Продевать нитку
2. параллельное программирование
3. var manualResetEventSlim = new ManualResetEventSlim()
4. threads.ForEach(t => t.Start());
5. threads.ForEach(t => t.Join());


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

Что я уже пробовал:

List<Thread> threads = new List<Thread>();
foreach (tblFrequencyPeriod Frequency in GetAllProcessing.ToList())
{
    var manualResetEventSlim = new ManualResetEventSlim();
    
    cnt += 1;
    int tmp = cnt; // copy value for closure
    Thread t = new Thread(() =>
    {
        ProcessEngine.ProcessEngine objServerLevelProcessing = new ProcessEngine.ProcessEngine();
        objServerLevelProcessing = new SalaryProcessEngine.SalaryProcessEngine(null, "", FrequencyPeriod);
        manualResetEventSlim.Wait();
        objServerLevelProcessing.Execute();
    });
    t.Start();
    threads.Add(t);
    //Thread.Sleep(1000);
    threads.ForEach(t => t.Start());
    threads.ForEach(t => t.Join());
}

1 Ответов

Рейтинг:
1

Richard Deeming

Ваш код кажется довольно запутанным. Это относится к переменной, которая не существует (FrequencyPeriod). Он не использует переменную цикла (FrequencyОн берет копию другой переменной "для закрытия", но никогда не использует эту копию. Каждый поток ожидает события ручного сброса, которое никогда не устанавливается. На каждой итерации цикла вы запускаете текущий поток, затем запускаете все потоки, а затем ждете завершения всех потоков.

Попробуйте использовать Parallel.ForEach вместо:

Parallel.ForEach(GetAllProcessing.ToList(), frequency =>
{
    ProcessEngine.ProcessEngine objServerLevelProcessing = new SalaryProcessEngine.SalaryProcessEngine(null, "", frequency);
    objServerLevelProcessing.Execute();
});
Параллель.Метод ForEach (System.Нарезание резьбы.Задачи) | Microsoft Docs[^]
Напишите простую параллельную программу, используя параллель.По Каждому Элементу | Майкрософт Документы[^]


Chaitanya Kulkarni

Привет Ричард
Спасибо Вам за ваше решение,
но он не работает только последняя запись выполняется кроме этого не работает
Не могли бы вы предложить какую-нибудь альтернативу

Richard Deeming

Тогда что-то не так в коде, который Вы нам не показали, или в данных, к которым у нас нет доступа.

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