Прочитать на английском

Поделиться через


Thread.Join Метод

Определение

Блокирует вызывающий поток до завершения потока, представленного этим экземпляром.

Перегрузки

Join()

Блокирует вызывающий поток до завершения потока, представленного экземпляром, продолжая отправлять стандартные сообщения COM и SendMessage.

Join(Int32)

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

Join(TimeSpan)

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

Join()

Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs

Блокирует вызывающий поток до завершения потока, представленного экземпляром, продолжая отправлять стандартные сообщения COM и SendMessage.

public void Join();

Исключения

Вызывающая сторона пыталась присоединиться к потоку, который находится в состоянии Unstarted.

Выполнение потока прервано во время ожидания.

Комментарии

Join — это метод синхронизации, который блокирует вызывающий поток (т. е. поток, вызывающий метод), пока не завершится поток, метод которого Join вызывается. Используйте этот метод, чтобы убедиться, что поток был завершен. Вызывающий объект будет блокироваться на неопределенный срок, если поток не завершается. В следующем примере Thread1 поток вызывает Join() метод Thread2, который приводит Thread1 к блокировке, пока не Thread2 завершится.

using System;
using System.Threading;

public class Example
{
   static Thread thread1, thread2;
   
   public static void Main()
   {
      thread1 = new Thread(ThreadProc);
      thread1.Name = "Thread1";
      thread1.Start();
      
      thread2 = new Thread(ThreadProc);
      thread2.Name = "Thread2";
      thread2.Start();   
   }

   private static void ThreadProc()
   {
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      if (Thread.CurrentThread.Name == "Thread1" && 
          thread2.ThreadState != ThreadState.Unstarted)
         thread2.Join();
      
      Thread.Sleep(4000);
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      Console.WriteLine("Thread1: {0}", thread1.ThreadState);
      Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
   }
}
// The example displays output like the following:
//       Current thread: Thread1
//       
//       Current thread: Thread2
//       
//       Current thread: Thread2
//       Thread1: WaitSleepJoin
//       Thread2: Running
//       
//       
//       Current thread: Thread1
//       Thread1: Running
//       Thread2: Stopped

Если поток уже завершился при Join вызове метода, метод возвращает немедленно.

Предупреждение

Никогда не следует вызывать Join метод Thread объекта , представляющего текущий поток из текущего потока. Это приводит к тому, что приложение перестает отвечать на запросы, так как текущий поток ожидает себя неограниченное время.

Этот метод изменяет состояние вызывающего потока, включив в него ThreadState.WaitSleepJoin. Невозможно вызвать Join в потоке, который находится в ThreadState.Unstarted состоянии .

См. также раздел

Применяется к

.NET 10 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Join(Int32)

Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs

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

public bool Join(int millisecondsTimeout);

Параметры

millisecondsTimeout
Int32

Количество миллисекунд ожидания завершения потока.

Возвращаемое значение

Значение true, если поток завершился; значение false, если поток не завершился по истечении количества времени, заданного параметром millisecondsTimeout.

Исключения

Значение millisecondsTimeout является отрицательным и не равно Infinite (в миллисекундах).

Поток не запущен.

Значение millisecondsTimeout меньше –1 (Timeout.Infinite).

Выполнение потока было прервано во время ожидания.

Комментарии

Join(Int32) — это метод синхронизации, который блокирует вызывающий поток (т. е. поток, вызывающий метод), пока не завершится поток, метод которого Join вызывается, или до истечения интервала времени ожидания. В следующем примере Thread1 поток вызывает Join() метод Thread2, который приводит Thread1 к блокировке либо до завершения, либо до Thread2 истечения 2 секунд.

using System;
using System.Threading;

public class Example
{
   static Thread thread1, thread2;
   
   public static void Main()
   {
      thread1 = new Thread(ThreadProc);
      thread1.Name = "Thread1";
      thread1.Start();
      
      thread2 = new Thread(ThreadProc);
      thread2.Name = "Thread2";
      thread2.Start();   
   }

   private static void ThreadProc()
   {
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      if (Thread.CurrentThread.Name == "Thread1" && 
          thread2.ThreadState != ThreadState.Unstarted)
         if (thread2.Join(2000))
            Console.WriteLine("Thread2 has termminated.");
         else
            Console.WriteLine("The timeout has elapsed and Thread1 will resume.");   
      
      Thread.Sleep(4000);
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      Console.WriteLine("Thread1: {0}", thread1.ThreadState);
      Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
   }
}
// The example displays the following output:
//       Current thread: Thread1
//       
//       Current thread: Thread2
//       The timeout has elapsed and Thread1 will resume.
//       
//       Current thread: Thread2
//       Thread1: WaitSleepJoin
//       Thread2: Running
//       
//       
//       Current thread: Thread1
//       Thread1: Running
//       Thread2: Stopped

Если Timeout.Infinite для параметра задано millisecondsTimeout значение , этот метод ведет себя так же, как перегрузка Join() метода, за исключением возвращаемого значения.

Если поток уже завершился при Join вызове метода, метод возвращает немедленно.

Этот метод изменяет состояние вызывающего потока, включив в него ThreadState.WaitSleepJoin. Невозможно вызвать Join в потоке, который находится в ThreadState.Unstarted состоянии .

См. также раздел

Применяется к

.NET 10 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Join(TimeSpan)

Исходный код:
Thread.cs
Исходный код:
Thread.cs
Исходный код:
Thread.cs

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

public bool Join(TimeSpan timeout);

Параметры

timeout
TimeSpan

Объект TimeSpan, в качестве значения которого задано время ожидания завершения процесса.

Возвращаемое значение

Значение true, если поток завершился; false, если поток не завершился по истечении количества времени, заданного параметром timeout.

Исключения

Значение равно отрицательному значению и не равно миллисекундам Infinite или больше int32.MaxValue миллисекундtimeout.

Вызывающая сторона пыталась присоединиться к потоку, который находится в состоянии Unstarted.

Примеры

В следующем примере кода показано, как использовать TimeSpan значение с методом Join .

using System;
using System.Threading;

class Test
{
    static TimeSpan waitTime = new TimeSpan(0, 0, 1);

    public static void Main() 
    {
        Thread newThread = new Thread(Work);
        newThread.Start();

        if(newThread.Join(waitTime + waitTime)) {
            Console.WriteLine("New thread terminated.");
        }
        else {
            Console.WriteLine("Join timed out.");
        }
    }

    static void Work()
    {
        Thread.Sleep(waitTime);
    }
}
// The example displays the following output:
//        New thread terminated.

Комментарии

Join(TimeSpan) — это метод синхронизации, который блокирует вызывающий поток (т. е. поток, вызывающий метод), пока не завершится поток, метод которого Join вызывается, или до истечения интервала времени ожидания. В следующем примере Thread1 поток вызывает Join() метод Thread2, который приводит Thread1 к блокировке либо до завершения, либо до Thread2 истечения 2 секунд.

using System;
using System.Threading;

public class Example
{
   static Thread thread1, thread2;
   
   public static void Main()
   {
      thread1 = new Thread(ThreadProc);
      thread1.Name = "Thread1";
      thread1.Start();
      
      thread2 = new Thread(ThreadProc);
      thread2.Name = "Thread2";
      thread2.Start();   
   }

   private static void ThreadProc()
   {
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      if (Thread.CurrentThread.Name == "Thread1" && 
          thread2.ThreadState != ThreadState.Unstarted)
         if (thread2.Join(TimeSpan.FromSeconds(2)))
            Console.WriteLine("Thread2 has termminated.");
         else
            Console.WriteLine("The timeout has elapsed and Thread1 will resume.");   
      
      Thread.Sleep(4000);
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      Console.WriteLine("Thread1: {0}", thread1.ThreadState);
      Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
   }
}
// The example displays the following output:
//       Current thread: Thread1
//       
//       Current thread: Thread2
//       The timeout has elapsed and Thread1 will resume.
//       
//       Current thread: Thread2
//       Thread1: WaitSleepJoin
//       Thread2: Running
//       
//       
//       Current thread: Thread1
//       Thread1: Running
//       Thread2: Stopped

Если Timeout.Infinite для задано timeoutзначение , этот метод ведет себя так же, как перегрузка Join() метода, за исключением возвращаемого значения.

Если поток уже завершился при Join вызове метода, метод возвращает немедленно.

Этот метод изменяет состояние текущего потока, включив в него WaitSleepJoin. Невозможно вызвать Join в потоке, который находится в ThreadState.Unstarted состоянии .

См. также раздел

Применяется к

.NET 10 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1