Task.Wait Metoda

Definicja

Czeka na Task zakończenie wykonywania.

Przeciążenia

Wait(TimeSpan)

Oczekuje na Task ukończenie wykonywania w określonym przedziale czasu.

Wait(CancellationToken)

Czeka na Task zakończenie wykonywania. Oczekiwanie kończy się, jeśli token anulowania zostanie anulowany przed ukończeniem zadania.

Wait(Int32)

Czeka na Task ukończenie wykonywania w ramach określonej liczby milisekund.

Wait(Int32, CancellationToken)

Czeka na Task zakończenie wykonywania. Oczekiwanie kończy się, jeśli upłynie interwał limitu czasu lub token anulowania zostanie anulowany przed zakończeniem zadania.

Wait()

Czeka na Task zakończenie wykonywania.

Wait(TimeSpan)

Oczekuje na Task ukończenie wykonywania w określonym przedziale czasu.

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

Parametry

timeout
TimeSpan

Wartość TimeSpan reprezentująca liczbę milisekund oczekiwania lub wartość reprezentująca TimeSpan -1 milisekundy oczekiwania na czas nieokreślony.

Zwraca

Boolean

truejeśli ukończone Task wykonanie w wyznaczonym czasie; w przeciwnym razie . false

Wyjątki

Element Task został usunięty.

timeout jest liczbą ujemną inną niż -1 milisekundy, która reprezentuje nieskończony limit czasu. -lub- timeout wartość jest większa niż MaxValue.

Zadanie zostało anulowane. Kolekcja InnerExceptions zawiera TaskCanceledException obiekt .

-lub- Podczas wykonywania zadania został zgłoszony wyjątek. Kolekcja InnerExceptions zawiera informacje o wyjątkach lub wyjątkach.

Przykłady

Poniższy przykład uruchamia zadanie, które generuje pięć milionów losowych liczb całkowitych z zakresu od 0 do 100 i oblicza ich średnią. W przykładzie użyto Wait(TimeSpan) metody oczekiwania na ukończenie aplikacji w ciągu 150 milisekund. Jeśli aplikacja zakończy się normalnie, zadanie wyświetla sumę i średnią wygenerowanych liczb losowych. Jeśli upłynął interwał limitu czasu, w przykładzie zostanie wyświetlony komunikat przed jego zakończeniem.

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.

Uwagi

Wait(TimeSpan) to metoda synchronizacji, która powoduje, że wątek wywołujący czeka na ukończenie bieżącego wystąpienia zadania do momentu wystąpienia jednego z następujących elementów:

  • Zadanie zostanie ukończone pomyślnie.

  • Samo zadanie jest anulowane lub zgłasza wyjątek. W takim przypadku obsłużysz AggregateException wyjątek. Właściwość AggregateException.InnerExceptions zawiera szczegółowe informacje o wyjątku lub wyjątkach.

  • Interwał zdefiniowany przez timeout upływ czasu. W takim przypadku bieżący wątek wznawia wykonywanie, a metoda zwraca wartość false.

Dotyczy

Wait(CancellationToken)

Czeka na Task zakończenie wykonywania. Oczekiwanie kończy się, jeśli token anulowania zostanie anulowany przed ukończeniem zadania.

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)

Parametry

cancellationToken
CancellationToken

Token anulowania, który będzie obserwowany podczas oczekiwania na ukończenie zadania.

Wyjątki

Element cancellationToken został anulowany.

Zadanie zostało usunięte.

Zadanie zostało anulowane. Kolekcja InnerExceptions zawiera TaskCanceledException obiekt .

-lub- Podczas wykonywania zadania został zgłoszony wyjątek. Kolekcja InnerExceptions zawiera informacje o wyjątkach lub wyjątkach.

Przykłady

Poniższy przykład ilustruje proste użycie tokenu anulowania w celu anulowania oczekiwania na ukończenie zadania. Zadanie jest uruchamiane, wywołuje metodę CancellationTokenSource.Cancel , aby anulować dowolne tokeny anulowania źródła tokenu, a następnie opóźnienia przez pięć sekund. Należy pamiętać, że samo zadanie nie zostało przekazane tokenu anulowania i nie można go anulować. Wątek aplikacji wywołuje metodę zadania w celu oczekiwania na ukończenie zadania Task.Wait , ale oczekiwanie jest anulowane po anulowaniu tokenu anulowania i OperationCanceledException jest zgłaszany. Procedura obsługi wyjątków zgłasza wyjątek, a następnie śpi przez sześć sekund. Jak pokazano w danych wyjściowych z przykładu, opóźnienie to umożliwia ukończenie zadania w RanToCompletion stanie .

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

Uwagi

Metoda Wait(CancellationToken) tworzy anulowanie oczekiwania. Oznacza to, że bieżący wątek czeka, aż wystąpi jeden z następujących elementów:

Uwaga

Anulowanie tokenu cancellationToken anulowania nie ma wpływu na uruchomione zadanie, chyba że został również przekazany token anulowania i jest przygotowany do obsługi anulowania. Przekazanie cancellationToken obiektu do tej metody umożliwia po prostu anulowanie oczekiwania.

Dotyczy

Wait(Int32)

Czeka na Task ukończenie wykonywania w ramach określonej liczby milisekund.

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

Parametry

millisecondsTimeout
Int32

Liczba milisekund oczekiwania lub Infinite (-1) na czas nieokreślony.

Zwraca

Boolean

truejeśli ukończone Task wykonanie w czasie przydzielonym; w przeciwnym razie . false

Wyjątki

Element Task został usunięty.

millisecondsTimeout jest liczbą ujemną inną niż -1, która reprezentuje nieskończony limit czasu.

Zadanie zostało anulowane. Kolekcja InnerExceptions zawiera TaskCanceledException obiekt .

-lub- Podczas wykonywania zadania został zgłoszony wyjątek. Kolekcja InnerExceptions zawiera informacje o wyjątkach lub wyjątkach.

Przykłady

Poniższy przykład uruchamia zadanie, które generuje pięć milionów liczb całkowitych losowych z zakresu od 0 do 100 i oblicza ich średnią. W przykładzie użyto Wait(Int32) metody oczekiwania na ukończenie aplikacji w ciągu 150 milisekund. Jeśli aplikacja zakończy się normalnie, zadanie wyświetla sumę i średnią wygenerowanych liczb losowych. Jeśli upłynął interwał limitu czasu, w przykładzie zostanie wyświetlony komunikat przed jego zakończeniem.

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.

Uwagi

Wait(Int32) to metoda synchronizacji, która powoduje, że wątek wywołujący oczekuje na ukończenie bieżącego wystąpienia zadania do momentu wystąpienia jednego z następujących:

  • Zadanie zostało ukończone pomyślnie.

  • Samo zadanie jest anulowane lub zgłasza wyjątek. W takim przypadku obsłużysz AggregateException wyjątek. Właściwość AggregateException.InnerExceptions zawiera szczegółowe informacje o wyjątku lub wyjątkach.

  • Interwał zdefiniowany przez millisecondsTimeout upłynął. W takim przypadku bieżący wątek wznawia wykonywanie, a metoda zwraca falsewartość .

Dotyczy

Wait(Int32, CancellationToken)

Czeka na Task zakończenie wykonywania. Oczekiwanie kończy się, jeśli upłynie interwał limitu czasu lub token anulowania zostanie anulowany przed zakończeniem zadania.

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

Parametry

millisecondsTimeout
Int32

Liczba milisekund oczekiwania lub Infinite (-1) oczekiwania na czas nieokreślony.

cancellationToken
CancellationToken

Token anulowania, który będzie obserwowany podczas oczekiwania na ukończenie zadania.

Zwraca

Boolean

truejeśli ukończone Task wykonanie w wyznaczonym czasie; w przeciwnym razie . false

Wyjątki

Element cancellationToken został anulowany.

Element Task został usunięty.

millisecondsTimeout jest liczbą ujemną inną niż -1, która reprezentuje nieskończony limit czasu.

Zadanie zostało anulowane. Kolekcja InnerExceptions zawiera TaskCanceledException obiekt .

-lub- Podczas wykonywania zadania został zgłoszony wyjątek. Kolekcja InnerExceptions zawiera informacje o wyjątkach lub wyjątkach.

Przykłady

Poniższy przykład wywołuje metodę Wait(Int32, CancellationToken) , aby podać zarówno wartość limitu czasu, jak i token anulowania, który może zakończyć oczekiwanie na ukończenie zadania. Nowy wątek jest uruchamiany i wykonuje metodę CancelToken , która wstrzymuje, a następnie wywołuje metodę CancellationTokenSource.Cancel , aby anulować tokeny anulowania. Zadanie jest następnie uruchamiane i opóźnione przez 5 sekund. Metoda Wait jest następnie wywoływana w celu oczekiwania na ukończenie zadania i jest dostarczana zarówno krótka wartość limitu czasu, jak i token anulowania.

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...

Należy pamiętać, że dokładne dane wyjściowe z przykładu zależą od tego, czy oczekiwanie zostało anulowane z powodu tokenu anulowania, czy też z powodu upływu interwału limitu czasu.

Uwagi

Wait(Int32, CancellationToken) to metoda synchronizacji, która powoduje, że wątek wywołujący czeka na ukończenie bieżącego wystąpienia zadania do momentu wystąpienia jednego z następujących elementów:

  • Zadanie zostanie ukończone pomyślnie.

  • Samo zadanie jest anulowane lub zgłasza wyjątek. W takim przypadku obsłużysz AggregateException wyjątek. Właściwość AggregateException.InnerExceptions zawiera szczegółowe informacje o wyjątku lub wyjątkach.

  • Token cancellationToken anulowania zostanie anulowany. W tym przypadku wywołanie Wait(Int32, CancellationToken) metody zgłasza błąd OperationCanceledException.

  • Interwał zdefiniowany przez millisecondsTimeout upływ czasu. W takim przypadku bieżący wątek wznawia wykonywanie, a metoda zwraca wartość false.

Uwaga

Anulowanie tokenu cancellationToken anulowania nie ma wpływu na uruchomione zadanie, chyba że został również przekazany token anulowania i jest przygotowany do obsługi anulowania. Przekazanie cancellationToken obiektu do tej metody umożliwia po prostu anulowanie oczekiwania na podstawie pewnego warunku.

Dotyczy

Wait()

Czeka na Task zakończenie wykonywania.

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

Wyjątki

Został Task usunięty.

Zadanie zostało anulowane. Kolekcja InnerExceptions zawiera TaskCanceledException obiekt.

-lub- Podczas wykonywania zadania został zgłoszony wyjątek. Kolekcja InnerExceptions zawiera informacje o wyjątku lub wyjątkach.

Przykłady

Poniższy przykład uruchamia zadanie, które generuje milion losowych liczb całkowitych z zakresu od 0 do 100 i oblicza ich średnią. W przykładzie Wait użyto metody , aby upewnić się, że zadanie zostanie ukończone przed zakończeniem działania aplikacji. W przeciwnym razie, ponieważ jest to aplikacja konsolowa, przykład zakończy się, zanim zadanie będzie mogło obliczyć i wyświetlić średnią.

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

Uwagi

Wait to metoda synchronizacji, która powoduje, że wątek wywołujący czeka, aż bieżące zadanie zostanie ukończone. Jeśli bieżące zadanie nie zostało uruchomione, metoda Wait próbuje usunąć zadanie z harmonogramu i wykonać je w tekście w bieżącym wątku. Jeśli nie można tego zrobić lub jeśli bieżące zadanie zostało już uruchomione, blokuje wątek wywołujący do momentu ukończenia zadania. Aby uzyskać więcej informacji, zobacz Task.Wait i "Inlining" w blogu Parallel Programming with .NET (Programowanie równoległe za pomocą platformy .NET).

Zobacz też

Dotyczy