Фоновый поток не работает, как указано в любом из его определений - PullRequest
0 голосов
/ 08 марта 2020

Определение: фоновый рисунок останавливается, когда основной поток покидает выполнение.

Источник

Когда я его пробую, фоновый поток не останавливает выполнение, даже когда основной поток завершает выполнение. Пожалуйста, проверьте пример, приведенный для Background Thread в приведенной выше ссылке.

с использованием Системы; используя System.Threading;

class GFG {

// Main method 
static void Main(string[] args) 
{ 
    // Creating and initializing thread 
    Thread thr = new Thread(mythread); 

    // Name of the thread is Mythread 
    thr.Name = "Mythread"; 
    thr.Start(); 

    // IsBackground is the property of Thread 
    // which allows thread to run in the background 
    thr.IsBackground = true; 

    Console.WriteLine("Main Thread Ends!!"); 
} 

// Static method 
static void mythread() 
{ 

    // Display the name of the  
    // current working thread 
    Console.WriteLine("In progress thread is: {0}", 
                        Thread.CurrentThread.Name); 

    Thread.Sleep(2000); 

    Console.WriteLine("Completed thread is: {0}", 
                      Thread.CurrentThread.Name); 
} 

}

Ожидаемый результат: Выполняется цепочка: Mythread Main Threads заканчивается !!

Я не получил вывод, как они там уже упоминали. Я получил все три консольных вывода, таких как

Выполняется ветка: Mythread Main Thread Ends. Завершенная тема: Mythread

Редактировать: Некоторые говорят, что Невозможно воспроизвести проблему. Я единственный, кто сталкивается с этой проблемой?

enter image description here

Ответы [ 3 ]

1 голос
/ 08 марта 2020

enter image description here

Прикрепленный снимок. Результат соответствует ожиданиям в документации. Я использую VS 2019, Net 3,5

0 голосов
/ 08 марта 2020

Поток запускается как часть "основного" контекста выполнения. Таким образом, при выходе из «main» «thr» будет собран и завершен, поскольку он является мгновенной частью основной программы. Во-вторых, «thr» запустился, поспал 2 секунды и вышел, делая то, что вы сказали. Если thr предназначен для продолжения работы, то он должен содержать al oop некоторого вида и реализацию сигнализации, чтобы сообщать ему о выходе, когда он больше не нужен.

Я еще не пробовал, но добавляю следующее для эксперимента. Это может работать ближе к тому, что вы пытаетесь сделать, но это не очень хороший способ сделать это.

static void mythread() 
{ 

  Do{
// Display the name of the  
// current working thread 
Console.WriteLine("In progress thread is: {0}", 
                    Thread.CurrentThread.Name); 

Thread.Sleep(2000); 

Console.WriteLine("Completed thread is: {0}", 
                  Thread.CurrentThread.Name); 
 }
While(sinalvariable) // signal variable changed by some other code 
                      //To tell thread  to exit the whileloop

} 

Если вы хотите, чтобы код оставался загруженным и работающим после основного выхода из исходного кода, вам нужно использовать другую стратегию. Вам нужно запустить код как «Процесс».

Я не могу дать полный ответ, так как проблема не ясна.

Ваша программа делает именно то, что ей нужно.

0 голосов
/ 08 марта 2020

Поместите свойство IsBackground до начала потока , например:

// Main method 
static void Main(string[] args) 
{ 
    // Creating and initializing thread 
    Thread thr = new Thread(mythread); 

    // Name of the thread is Mythread 
    thr.Name = "Mythread"; 

    // IsBackground is the property of Thread 
    // which allows thread to run in the background 
    thr.IsBackground = true; 
    thr.Start();

    Console.WriteLine("Main Thread Ends!!"); 
}
...