Создание потока Foreground VS Thread.Join()

91
7

Если foreground thread - это поток, который предотвращает завершение процесса до тех пор, пока не будут завершены все потоки переднего плана, принадлежащие процессу, и если метод Join Блокирует вызывающий поток до тех пор, пока поток не завершится, тогда какая разница между два метода?


Foreground Thread:


static void Main()
{
Thread foregroundThread =
new Thread(new ThreadStart(SomeMethod));
foregroundThread.Name = "ForegroundThread";

foregroundThread.IsBackground = false;

foregroundThread.Start();
}


Метод Join():


static void Main() 
{
Thread thread =
new Thread(new ThreadStart(SomeMethod));

thread.Name = "Thread";
thread.Start();
thread.Join();
}


Есть ли разница между двумя подходами?

спросил(а) 2021-01-19T18:19:11+03:00 9 месяцев назад
1
Решение
79

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


Основное преимущество потоков foreground возникает, когда вы пытаетесь запустить потоки из другого фонового потока.


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

Представьте, что у вас такой сценарий:


static void Main()
{
Thread backgroundThread = new Thread(new ThreadStart(SomeMethod));
thread.IsBackground = true;
backgroundThread.Start();
}

static void SomeMethod()
{
Thread thread = new Thread(new ThreadStart(SomeOtherMethod));
thread.Name = "ForegroundThread";
thread.IsBackground = false;
thread.Start();
}


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

ответил(а) 2021-01-19T18:19:11+03:00 9 месяцев назад
47

Разница заключается в концепции Fire и Forget.i.e. Один не дожидается конца потока. Если вы вызываете метод Join, вы явно ожидаете завершения потока.

ответил(а) 2021-01-19T18:19:11+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема