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


Task.Wait Метод

Определение

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

Перегрузки

Wait(TimeSpan, CancellationToken)

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

Wait(Int32, CancellationToken)

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

Wait(TimeSpan)

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

Wait(CancellationToken)

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

Wait()

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

Wait(Int32)

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

Wait(TimeSpan, CancellationToken)

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

Ожидает завершения выполнения задачи 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 наблюдения во время ожидания завершения задачи.

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

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

Исключения

Отменено Task

-или-

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

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

-или-

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

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

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

Wait(Int32, CancellationToken)

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

Ожидает завершения выполнения задачи 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

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

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

Значение 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...
open System
open System.Threading
open System.Threading.Tasks

let cancelToken (obj: obj) =
    Thread.Sleep 1500
    printfn $"Canceling the cancellation token from thread {Thread.CurrentThread.ManagedThreadId}..."

    match obj with
    | :? CancellationTokenSource as source -> source.Cancel()
    | _ -> ()

let ts = new CancellationTokenSource()
let thread = Thread(ParameterizedThreadStart cancelToken)
thread.Start ts

let t =
    Task.Run(fun () ->
        Task.Delay(5000).Wait()
        printfn "Task ended delay...")

try
    printfn $"About to wait completion of task {t.Id}"
    let result = t.Wait(1510, ts.Token)
    printfn $"Wait completed normally: {result}"
    printfn $"The task status:  {t.Status:G}"

with :? OperationCanceledException as e ->
    printfn $"{e.GetType().Name}: The wait has been canceled. Task status: {t.Status:G}"
    Thread.Sleep 4000
    printfn $"After sleeping, the task status:  {t.Status:G}"
    ts.Dispose()

// 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 в параметрах elapses. В этом случае текущий поток возобновляет выполнение, а метод возвращает .false

Примечание

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

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

Wait(TimeSpan)

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

Ожидает завершения выполнения задач 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 миллисекунду для неограниченного ожидания.

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

Значение 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.
open System
open System.Threading.Tasks

let t =
    Task.Run(fun () ->
        let rnd = Random()
        let mutable sum = 0L
        let n = 5000000

        for _ = 1 to n do
            let number = rnd.Next(0, 101)
            sum <- sum + int64 number

        printfn $"Total:   {sum:N0}"
        printfn $"Mean:    {float sum / float n:N2}"
        printfn $"N:       {n:N0}")

let ts = TimeSpan.FromMilliseconds 150

if t.Wait ts |> not then
    printfn "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 в параметрах elapses. В этом случае текущий поток возобновляет выполнение, а метод возвращает .false

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

Wait(CancellationToken)

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

Ожидает завершения выполнения задачи 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
open System
open System.Threading
open System.Threading.Tasks

let ts = new CancellationTokenSource()

let t =
    Task.Run(fun () ->
        printfn "Calling Cancel..."
        ts.Cancel()
        Task.Delay(5000).Wait()
        printfn $"Task ended delay...")

try
    printfn "About to wait for the task to complete..."
    t.Wait ts.Token

with :? OperationCanceledException as e ->
    printfn $"{e.GetType().Name}: The wait has been canceled. Task status: {t.Status:G}"
    Thread.Sleep 6000
    printfn $"After sleeping, the task status:  {t.Status:G}"

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()

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

Ожидает завершения выполнения задачи 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
open System
open System.Threading.Tasks

let t =
    Task.Run(fun () ->
        let rnd = Random()
        let mutable sum = 0L
        let n = 1000000

        for _ = 1 to n do
            let number = rnd.Next(0, 101)
            sum <- sum + int64 number

        printfn $"Total:   {sum:N0}"
        printfn $"Mean:    {float sum / float n:N2}"
        printfn $"N:       {n:N0}")

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.cs
Исходный код:
Task.cs
Исходный код:
Task.cs

Ожидает завершения задачи 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) в случае неограниченного времени ожидания.

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

Значение 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.
open System
open System.Threading.Tasks

let t =
    Task.Run(fun () ->
        let rnd = Random()
        let mutable sum = 0L
        let n = 5000000

        for _ = 1 to n do
            let number = rnd.Next(0, 101)
            sum <- sum + int64 number

        printfn $"Total:   {sum:N0}"
        printfn $"Mean:    {float sum / float n:N2}"
        printfn $"N:       {n:N0}")

if t.Wait 150 |> not then
    printfn "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 в параметрах elapses. В этом случае текущий поток возобновляет выполнение, а метод возвращает false.

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