C # Поддерживать потоки живыми, даже если консольное приложение выходит - PullRequest
0 голосов
/ 09 октября 2018

У меня есть консольное приложение в c #, которое работает бесконечно и выглядит примерно так:

class Program
{
    static void Main(string[] args)
    {    
        while(true)
        {
                var listOfIds = GetItemIds();
                Parallel.ForEach(listOfIds, new Parallel{ MaxDegreeOfParallelism = 15}, th => DoWork(th));
                Console.WriteLine("Iteration Complete");
        }
    }

    static void DoWork(int id)
    {
        //do some work and save data
        //...
    }

    static List<int> GetItemIds()
    {
        //return a list of ints.
    }       
}

Пока поток находится в «DoWork», он обрабатывает данные, модифицирует их и сохраняет.Приложение ждет, пока все не завершится, и затем снова начинает новую итерацию.

Теперь, если консольное приложение закрыто, кажется, что потоки не заканчивают свою работу и умирают с консольным приложением.Я думал, что потоки, созданные с помощью 'Parallel', не зависят от основного потока.Есть ли способ заставить потоки завершить свою работу, даже если я выйду из консольного приложения?я должен использовать что-то другое, а не 'Parallel' для создания потоков?

1 Ответ

0 голосов
/ 09 октября 2018

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

Возможно, вы захотите использовать приложение Windows, которое позволит вам более детально контролировать основной цикл приложения.Это может быть служба Windows или приложение типа WinForm / WPF (которое даже не обязательно должно иметь пользовательский интерфейс, если вы не хотите).

Если вы хотите приложение Windows, которое все еще показываетконсоль - это немного шатко, но вы можете найти пример того, как это сделать здесь .

...