2009-10-11 3 views
6

Я новичок в C#. Я узнал, что обычно все потоки переднего плана, пока вы явно не укажете его как «фоновый» поток, используя IsBackGround = true.Background Threads in C#

Некоторые сомнения возникли у меня на голове.

1) В чем преимущество сохранения потока в качестве фоновой нити?

2) При выполнении ниже код:

static void Main(string[] args) 
    { 
     Thread worker = new Thread(SayHello); 
     worker.IsBackground = true; 
     worker.Start(); 
     Console.WriteLine("Hello From Main"); 
    } 

    static void SayHello() 
    { 
     Console.WriteLine("Hello World"); 
     Console.ReadKey(true); 
    } 

мне нужно использовать worker.Join(), чтобы сохранить основной поток ждать, как программа завершается немедленно. Помимо Join(), можно ли использовать другие методы, чтобы поддерживать главный поток?

+3

Threading in C# - довольно интересная вещь. Я настоятельно рекомендую ClR через книгу C# от Джеффри Рихтера. У него есть объяснение из ядра Windows о том, как потоки работают на C#. К сожалению, многие из этих концепций возвращаются на C++ Win32 threading api. – Spence

+3

У вас будет больше удовольствия с материалами синхронизации потоков. Посмотрите на Систему.Threading.Semaphore, ManualResetEvent, AutoResetEvent, Mutex и Interlocked. Все это очень полезно для работы с потоками. – Spence

+0

Thank Spence Большое спасибо. Я посмотрю на это. – user186973

ответ

11

1) В чем преимущество сохранения резьбы в качестве фоновой нити?

Преимущество в том, что фоновый поток не останавливает выполнение программы. В большом приложении может быть немного сложно деактивировать все потоки, если вы хотите выйти из приложения.

Помимо Join(), можно ли использовать другие методы, чтобы поддерживать основную нить?

Если вы хотите, чтобы главная программа ждала, почему вы делаете нить фоновой нитью в первую очередь? Помимо функции Join(), вы можете использовать EventWaitHandle или Monitor, чтобы заставить основной метод ждать.

6

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

В ответ на ваш вопрос, да, вы должны присоединиться, поскольку поток, который находится в фоновом режиме, не сохранит его, поэтому, когда пусковой поток покинет Main(), он позволит приложению выйти.

3

Если поток должен завершиться до завершения программы, то это не должно быть фоновым потоком.

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

Метод Join обычно используется, чтобы убедиться, что потоки выполняются до того, как вызывающий поток продолжается. Например, вы можете создать 5 потоков, каждый из которых выполняет некоторую математическую операцию, и результаты этих операций могут потребоваться для перехода к следующему шагу. Метод Join приостанавливает выполнение на вызывающем потоке до тех пор, пока порожденные потоки не будут завершены. Важно отметить, что если вы вызываете Join из потока пользовательского интерфейса, вы заморозите свою программу до тех пор, пока порожденные потоки не будут завершены.

Короче говоря, многопоточность очень сложная и тонкая. Я настоятельно рекомендую купить хорошую книгу на эту тему.