Task.Wait Метод

Определение

Ожидает завершения выполнения задачи Task.

Перегрузки

Wait(TimeSpan)

Ожидает завершения выполнения задач Task в течение указанного временного периода.

Wait(Int32, CancellationToken)

Ожидает завершения выполнения задачи Task. Ожидание завершается, если время ожидания истекает или токен отмены отменяется до завершения задачи.

Wait(CancellationToken)

Ожидает завершения выполнения задачи Task. Ожидание завершается, если токен отмены отменяется до завершения задачи.

Wait(TimeSpan, CancellationToken)

Ожидает завершения выполнения задачи Task.

Wait()

Ожидает завершения выполнения задачи Task.

Wait(Int32)

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

Wait(TimeSpan)

Ожидает завершения выполнения задач Task в течение указанного временного периода.

public:
 bool Wait(TimeSpan timeout);
public bool Wait (TimeSpan timeout);
member this.Wait : TimeSpan -> bool
Public Function Wait (timeout As TimeSpan) As Boolean

Параметры

timeout
TimeSpan

Период TimeSpan, представляющий время ожидания в миллисекундах, или период TimeSpan, представляющий -1 миллисекунду для неограниченного ожидания.

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

Boolean

Значение true, если Task завершил выполнение в течение отведенного времени; в противном случае — значение false.

Исключения

Объект Task удален.

timeout является отрицательным числом, отличным от -1 миллисекунды, которое представляет неограниченное время ожидания. -или- timeout больше , чем Int32.MaxValue.

Задача отменена. Коллекция InnerExceptions содержит объект TaskCanceledException.

-или- Во время выполнения задачи возникло исключение. Коллекция InnerExceptions содержит сведения об исключении или исключениях.

Примеры

В следующем примере запускается задача, которая создает пять миллионов случайных целых чисел от 0 до 100 и вычисляет их среднее значение. В этом примере метод используется Wait(TimeSpan) для ожидания завершения приложения в течение 150 миллисекундах. Если приложение завершается нормально, задача отображает сумму и среднее значение созданных случайных чисел. Если интервал времени ожидания истек, в примере отображается сообщение до его завершения.

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Run( () => {
                            Random rnd = new Random();
                            long sum = 0;
                            int n = 5000000;
                            for (int ctr = 1; ctr <= n; ctr++) {
                               int number = rnd.Next(0, 101);
                               sum += number;
                            }
                            Console.WriteLine("Total:   {0:N0}", sum);
                            Console.WriteLine("Mean:    {0:N2}", sum/n);
                            Console.WriteLine("N:       {0:N0}", n);   
                         } );
     TimeSpan ts = TimeSpan.FromMilliseconds(150);
     if (! t.Wait(ts))
        Console.WriteLine("The timeout interval elapsed.");
   }
}
// The example displays output similar to the following:
//       Total:   50,015,714
//       Mean:    50.02
//       N:       1,000,000
// Or it displays the following output:
//      The timeout interval elapsed.
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t As Task = Task.Run( Sub()
                                   Dim rnd As New Random()
                                   Dim sum As Long
                                   Dim n As Integer = 5000000
                                   For ctr As Integer = 1 To n
                                      Dim number As Integer = rnd.Next(0, 101)
                                      sum += number
                                   Next
                                   Console.WriteLine("Total:   {0:N0}", sum)
                                   Console.WriteLine("Mean:    {0:N2}", sum/n)
                                   Console.WriteLine("N:       {0:N0}", n)   
                                End Sub)
     Dim ts As TimeSpan = TimeSpan.FromMilliseconds(150)
     If Not t.Wait(ts) Then
        Console.WriteLine("The timeout interval elapsed.")
     End If
   End Sub
End Module
' The example displays output similar to the following:
'       Total:   50,015,714
'       Mean:    50.02
'       N:       1,000,000
' Or it displays the following output:
'       The timeout interval elapsed.

Комментарии

Wait(TimeSpan) — это метод синхронизации, который приводит к тому, что вызывающий поток ожидает завершения текущего экземпляра задачи, пока не произойдет одно из следующих действий:

  • Задача завершается успешно.

  • Сама задача отменена или вызывает исключение. В этом случае вы обрабатываете AggregateException исключение. Свойство AggregateException.InnerExceptions содержит сведения об исключении или исключениях.

  • Интервал, определенный затраченными интервалами timeout . В этом случае текущий поток возобновляет выполнение, а метод возвращает false.

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

Wait(Int32, CancellationToken)

Ожидает завершения выполнения задачи Task. Ожидание завершается, если время ожидания истекает или токен отмены отменяется до завершения задачи.

public:
 bool Wait(int millisecondsTimeout, System::Threading::CancellationToken cancellationToken);
public bool Wait (int millisecondsTimeout, System.Threading.CancellationToken cancellationToken);
member this.Wait : int * System.Threading.CancellationToken -> bool
Public Function Wait (millisecondsTimeout As Integer, cancellationToken As CancellationToken) As Boolean

Параметры

millisecondsTimeout
Int32

Время ожидания в миллисекундах или функция Infinite (-1) в случае неограниченного времени ожидания.

cancellationToken
CancellationToken

Токен отмены, который нужно контролировать во время ожидания выполнения задачи.

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

Boolean

Значение true, если Task завершил выполнение в течение отведенного времени; в противном случае — значение false.

Исключения

Объект cancellationToken отменен.

Объект Task удален.

Параметр millisecondsTimeout является отрицательным числом, отличным от –1, что означает бесконечное время ожидания.

Задача отменена. Коллекция InnerExceptions содержит объект TaskCanceledException.

-или- Во время выполнения задачи возникло исключение. Коллекция InnerExceptions содержит сведения об исключении или исключениях.

Примеры

В следующем примере метод вызывается Wait(Int32, CancellationToken) для предоставления значения времени ожидания и маркера отмены, который может завершить ожидание завершения задачи. Запускается новый поток и выполняется метод, который приостанавливает CancelToken , а затем вызывает CancellationTokenSource.Cancel метод для отмены маркеров отмены. Затем запускается задача и задерживается в течение 5 секунд. Затем Wait вызывается метод, чтобы дождаться завершения задачи и предоставляется как краткое значение времени ожидания, так и токен отмены.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      CancellationTokenSource ts = new CancellationTokenSource();
      Thread thread = new Thread(CancelToken);
      thread.Start(ts);

      Task t = Task.Run( () => { Task.Delay(5000).Wait();
                                 Console.WriteLine("Task ended delay...");
                               });
      try {
         Console.WriteLine("About to wait completion of task {0}", t.Id);
         bool result = t.Wait(1510, ts.Token);
         Console.WriteLine("Wait completed normally: {0}", result);
         Console.WriteLine("The task status:  {0:G}", t.Status);
      }
      catch (OperationCanceledException e) {
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status);
         Thread.Sleep(4000);
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status);
         ts.Dispose();
      }
   }

   private static void CancelToken(Object obj)
   {
      Thread.Sleep(1500);
      Console.WriteLine("Canceling the cancellation token from thread {0}...",
                        Thread.CurrentThread.ManagedThreadId);
      CancellationTokenSource source = obj as CancellationTokenSource;
      if (source != null) source.Cancel();
   }
}
// The example displays output like the following if the wait is canceled by
// the cancellation token:
//    About to wait completion of task 1
//    Canceling the cancellation token from thread 3...
//    OperationCanceledException: The wait has been canceled. Task status: Running
//    Task ended delay...
//    After sleeping, the task status:  RanToCompletion
// The example displays output like the following if the wait is canceled by
// the timeout interval expiring:
//    About to wait completion of task 1
//    Wait completed normally: False
//    The task status:  Running
//    Canceling the cancellation token from thread 3...
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim ts As New CancellationTokenSource()
      Dim thread As New Thread(AddressOf CancelToken)
      thread.Start(ts)

      Dim t As Task = Task.Run( Sub()
                                   Task.Delay(5000).Wait()
                                    Console.WriteLine("Task ended delay...")
                                End Sub)
      Try
         Console.WriteLine("About to wait completion of task {0}", t.Id)
         Dim result As Boolean = t.Wait(1510, ts.Token)
         Console.WriteLine("Wait completed normally: {0}", result)
         Console.WriteLine("The task status:  {0:G}", t.Status)
      Catch e As OperationCanceledException
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status)
         Thread.Sleep(4000)
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status)
         ts.Dispose()
      End Try
   End Sub

   Private Sub CancelToken(obj As Object)
      Thread.Sleep(1500)
      Console.WriteLine("Canceling the cancellation token from thread {0}...",
                        Thread.CurrentThread.ManagedThreadId)

      If TypeOf obj Is CancellationTokenSource Then
         Dim source As CancellationTokenSource = CType(obj, CancellationTokenSource)
         source.Cancel()
      End If
   End Sub
End Module
' The example displays output like the following if the wait is canceled by
' the cancellation token:
'    About to wait completion of task 1
'    Canceling the cancellation token from thread 3...
'    OperationCanceledException: The wait has been canceled. Task status: Running
'    Task ended delay...
'    After sleeping, the task status:  RanToCompletion
' The example displays output like the following if the wait is canceled by
' the timeout interval expiring:
'    About to wait completion of task 1
'    Wait completed normally: False
'    The task status:  Running
'    Canceling the cancellation token from thread 3...

Обратите внимание, что точные выходные данные из примера зависят от того, было ли отменено ожидание из-за токена отмены или из-за истечения времени ожидания.

Комментарии

Wait(Int32, CancellationToken) — это метод синхронизации, который приводит к тому, что вызывающий поток ожидает завершения текущего экземпляра задачи, пока не произойдет одно из следующих действий:

  • Задача завершается успешно.

  • Сама задача отменена или вызывает исключение. В этом случае вы обрабатываете AggregateException исключение. Свойство AggregateException.InnerExceptions содержит сведения об исключении или исключениях.

  • cancellationToken Токен отмены отменен. В этом случае вызов Wait(Int32, CancellationToken) метода вызывает исключение OperationCanceledException.

  • Интервал, определенный затраченными интервалами millisecondsTimeout . В этом случае текущий поток возобновляет выполнение, а метод возвращает false.

Примечание

Отмена cancellationToken маркера отмены не влияет на выполняющуюся задачу, если она также не была передана маркеру отмены и готова к обработке отмены. Передача объекта этому cancellationToken методу просто позволяет отменить ожидание в зависимости от определенного условия.

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

Wait(CancellationToken)

Ожидает завершения выполнения задачи Task. Ожидание завершается, если токен отмены отменяется до завершения задачи.

public:
 void Wait(System::Threading::CancellationToken cancellationToken);
public void Wait (System.Threading.CancellationToken cancellationToken);
member this.Wait : System.Threading.CancellationToken -> unit
Public Sub Wait (cancellationToken As CancellationToken)

Параметры

cancellationToken
CancellationToken

Токен отмены, который нужно контролировать во время ожидания выполнения задачи.

Исключения

Объект cancellationToken отменен.

Задача была удалена.

Задача отменена. Коллекция InnerExceptions содержит объект TaskCanceledException.

-или- Во время выполнения задачи возникло исключение. Коллекция InnerExceptions содержит сведения об исключении или исключениях.

Примеры

В следующем примере показано простое использование токена отмены для отмены ожидания завершения задачи. Запускается задача, вызывает CancellationTokenSource.Cancel метод для отмены любого из маркеров отмены источника маркеров, а затем задерживается в течение пяти секунд. Обратите внимание, что сама задача не была передана маркеру отмены и не может быть отменена. Поток приложения вызывает метод задачи для ожидания завершения задачи Task.Wait , но после отмены OperationCanceledException маркера отмены и создания. Обработчик исключений сообщает об исключении, а затем переходит в спящий режим в течение шести секунд. Как показано в выходных данных примера, эта задержка позволяет завершить задачу в RanToCompletion состоянии.

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      CancellationTokenSource ts = new CancellationTokenSource();

      Task t = Task.Run( () => { Console.WriteLine("Calling Cancel...");
                                 ts.Cancel();
                                 Task.Delay(5000).Wait();
                                 Console.WriteLine("Task ended delay...");
                               });
      try {
         Console.WriteLine("About to wait for the task to complete...");
         t.Wait(ts.Token);
      }
      catch (OperationCanceledException e) {
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status);
         Thread.Sleep(6000);
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status);
      }
      ts.Dispose();
   }
}
// The example displays output like the following:
//    About to wait for the task to complete...
//    Calling Cancel...
//    OperationCanceledException: The wait has been canceled. Task status: Running
//    Task ended delay...
//    After sleeping, the task status:  RanToCompletion
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim ts As New CancellationTokenSource()

      Dim t = Task.Run( Sub()
                           Console.WriteLine("Calling Cancel...")
                           ts.Cancel()
                           Task.Delay(5000).Wait()
                           Console.WriteLine("Task ended delay...")
                        End Sub)
      Try
         Console.WriteLine("About to wait for the task to complete...")
         t.Wait(ts.Token)
      Catch e As OperationCanceledException
         Console.WriteLine("{0}: The wait has been canceled. Task status: {1:G}",
                           e.GetType().Name, t.Status)
         Thread.Sleep(6000)
         Console.WriteLine("After sleeping, the task status:  {0:G}", t.Status)
      End Try
      ts.Dispose()
   End Sub
End Module
' The example displays output like the following:
'    About to wait for the task to complete...
'    Calling Cancel...
'    OperationCanceledException: The wait has been canceled. Task status: Running
'    Task ended delay...
'    After sleeping, the task status:  RanToCompletion

Комментарии

Метод Wait(CancellationToken) создает отменяемое ожидание, т. е. вызывает ожидание текущего потока до следующего:

Примечание

Отмена cancellationToken маркера отмены не влияет на выполняющуюся задачу, если она также не была передана маркеру отмены и готова к обработке отмены. cancellationToken Передача объекта этому методу просто позволяет отменить ожидание.

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

Wait(TimeSpan, CancellationToken)

Ожидает завершения выполнения задачи Task.

public:
 bool Wait(TimeSpan timeout, System::Threading::CancellationToken cancellationToken);
public bool Wait (TimeSpan timeout, System.Threading.CancellationToken cancellationToken);
member this.Wait : TimeSpan * System.Threading.CancellationToken -> bool
Public Function Wait (timeout As TimeSpan, cancellationToken As CancellationToken) As Boolean

Параметры

timeout
TimeSpan

Время ожидания или InfiniteTimeSpan неопределенное время ожидания

cancellationToken
CancellationToken

О CancellationToken , чтобы наблюдать за ожиданием завершения задачи.

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

Boolean

Значение true, если Task завершил выполнение в течение отведенного времени; в противном случае — значение false.

Исключения

Отменено Task

-или-

исключение было вызвано во время выполнения .Task

timeout — отрицательное число, отличное от -1 миллисекунда, которое представляет бесконечное время ожидания.

-или-

Время ожидания больше MaxValue.

Объект cancellationToken отменен.

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

Wait()

Ожидает завершения выполнения задачи Task.

public:
 void Wait();
public void Wait ();
member this.Wait : unit -> unit
Public Sub Wait ()

Исключения

Объект Task удален.

Задача отменена. Коллекция InnerExceptions содержит объект TaskCanceledException.

-или- Во время выполнения задачи возникло исключение. Коллекция InnerExceptions содержит сведения об исключении или исключениях.

Примеры

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

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Run( () => {
                            Random rnd = new Random();
                            long sum = 0;
                            int n = 1000000;
                            for (int ctr = 1; ctr <= n; ctr++) {
                               int number = rnd.Next(0, 101);
                               sum += number;
                            }
                            Console.WriteLine("Total:   {0:N0}", sum);
                            Console.WriteLine("Mean:    {0:N2}", sum/n);
                            Console.WriteLine("N:       {0:N0}", n);   
                         } );
     t.Wait();
   }
}
// The example displays output similar to the following:
//       Total:   50,015,714
//       Mean:    50.02
//       N:       1,000,000
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t As Task = Task.Run( Sub()
                                   Dim rnd As New Random()
                                   Dim sum As Long
                                   Dim n As Integer = 1000000
                                   For ctr As Integer = 1 To n
                                      Dim number As Integer = rnd.Next(0, 101)
                                      sum += number
                                   Next
                                   Console.WriteLine("Total:   {0:N0}", sum)
                                   Console.WriteLine("Mean:    {0:N2}", sum/n)
                                   Console.WriteLine("N:       {0:N0}", n)   
                                End Sub)
     t.Wait()
   End Sub
End Module
' The example displays output similar to the following:
'       Total:   50,015,714
'       Mean:    50.02
'       N:       1,000,000

Комментарии

Wait — это метод синхронизации, который вызывает поток ожидания до завершения текущей задачи. Если текущая задача не запущена, метод Wait пытается удалить задачу из планировщика и выполнить ее встроенно в текущем потоке. Если это не удается сделать или если текущая задача уже запущена, она блокирует вызывающий поток до завершения задачи. Дополнительные сведения см. в разделе Task.Wait и Inlining в блоге о параллельном программировании с .NET.

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

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

Wait(Int32)

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

public:
 bool Wait(int millisecondsTimeout);
public bool Wait (int millisecondsTimeout);
member this.Wait : int -> bool
Public Function Wait (millisecondsTimeout As Integer) As Boolean

Параметры

millisecondsTimeout
Int32

Время ожидания в миллисекундах или функция Infinite (-1) в случае неограниченного времени ожидания.

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

Boolean

Значение true, если Task завершил выполнение в течение отведенного времени; в противном случае — значение false.

Исключения

Объект Task удален.

Параметр millisecondsTimeout является отрицательным числом, отличным от –1, что означает бесконечное время ожидания.

Задача отменена. Коллекция InnerExceptions содержит объект TaskCanceledException.

-или- Во время выполнения задачи возникло исключение. Коллекция InnerExceptions содержит сведения об исключении или исключениях.

Примеры

В следующем примере запускается задача, которая создает пять миллионов случайных целых чисел от 0 до 100 и вычисляет их среднее значение. В этом примере метод используется Wait(Int32) для ожидания завершения приложения в течение 150 миллисекундах. Если приложение завершается нормально, задача отображает сумму и среднее значение созданных случайных чисел. Если интервал времени ожидания истек, в примере отображается сообщение до его завершения.

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task t = Task.Run( () => {
                            Random rnd = new Random();
                            long sum = 0;
                            int n = 5000000;
                            for (int ctr = 1; ctr <= n; ctr++) {
                               int number = rnd.Next(0, 101);
                               sum += number;
                            }
                            Console.WriteLine("Total:   {0:N0}", sum);
                            Console.WriteLine("Mean:    {0:N2}", sum/n);
                            Console.WriteLine("N:       {0:N0}", n);   
                         } );
     if (! t.Wait(150))
        Console.WriteLine("The timeout interval elapsed.");
   }
}
// The example displays output similar to the following:
//       Total:   50,015,714
//       Mean:    50.02
//       N:       1,000,000
// Or it displays the following output:
//      The timeout interval elapsed.
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim t As Task = Task.Run( Sub()
                                   Dim rnd As New Random()
                                   Dim sum As Long
                                   Dim n As Integer = 5000000
                                   For ctr As Integer = 1 To n
                                      Dim number As Integer = rnd.Next(0, 101)
                                      sum += number
                                   Next
                                   Console.WriteLine("Total:   {0:N0}", sum)
                                   Console.WriteLine("Mean:    {0:N2}", sum/n)
                                   Console.WriteLine("N:       {0:N0}", n)   
                                End Sub)
     If Not t.Wait(150) Then
        Console.WriteLine("The timeout interval elapsed.")
     End If
   End Sub
End Module
' The example displays output similar to the following:
'       Total:   50,015,714
'       Mean:    50.02
'       N:       1,000,000
' Or it displays the following output:
'       The timeout interval elapsed.

Комментарии

Wait(Int32) — это метод синхронизации, который вызывает поток ожидания завершения текущего экземпляра задачи до тех пор, пока не произойдет одно из следующих действий:

  • Задача успешно завершена.

  • Сама задача отменена или вызывает исключение. В этом случае вы обрабатываете AggregateException исключение. Свойство AggregateException.InnerExceptions содержит сведения об исключении или исключениях.

  • Интервал, определенный millisecondsTimeout истекает. В этом случае текущий поток возобновляет выполнение, а метод возвращает .false

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