TaskFactory Klas

Definitie

Biedt ondersteuning voor het maken en plannen van Task objecten.

public ref class TaskFactory
public class TaskFactory
type TaskFactory = class
Public Class TaskFactory
Overname
TaskFactory

Voorbeelden

In het volgende voorbeeld wordt de statische Factory eigenschap gebruikt om twee aanroepen naar de TaskFactory.StartNew methode uit te voeren. De eerste vult een matrix met de namen van bestanden in de map MyDocuments van de gebruiker, terwijl de tweede een matrix vult met de namen van submappen van de map MyDocuments van de gebruiker. Vervolgens wordt de TaskFactory.ContinueWhenAll(Task[], Action<Task[]>) methode aangeroepen, die informatie weergeeft over het aantal bestanden en mappen in de twee matrices nadat de eerste twee taken de uitvoering hebben voltooid.

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

public class Example
{
   public static void Main()
   {
      Task[] tasks = new Task[2];
      String[] files = null;
      String[] dirs = null;
      String docsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

      tasks[0] = Task.Factory.StartNew( () => files = Directory.GetFiles(docsDirectory));
      tasks[1] = Task.Factory.StartNew( () => dirs = Directory.GetDirectories(docsDirectory));

      Task.Factory.ContinueWhenAll(tasks, completedTasks => {
                                             Console.WriteLine("{0} contains: ", docsDirectory);
                                             Console.WriteLine("   {0} subdirectories", dirs.Length);
                                             Console.WriteLine("   {0} files", files.Length);
                                          } );
   }
}
// The example displays output like the following:
//       C:\Users\<username>\Documents contains:
//          24 subdirectories
//          16 files
Imports System.IO
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim tasks(1) As Task
      Dim files() As String = Nothing
      Dim dirs() As String = Nothing
      Dim docsDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
      
      tasks(0) = Task.Factory.StartNew( Sub()
                                           files = Directory.GetFiles(docsDirectory)
                                        End Sub )
      tasks(1) = Task.Factory.StartNew( Sub()
                                           dirs = Directory.GetDirectories(docsDirectory)
                                        End Sub )
      Task.Factory.ContinueWhenAll(tasks, Sub(completedTasks)
                                             Console.WriteLine("{0} contains: ", docsDirectory)
                                             Console.WriteLine("   {0} subdirectories", dirs.Length)
                                             Console.WriteLine("   {0} files", files.Length)
                                          End Sub)
   End Sub
End Module
' The example displays output like the following:
'       C:\Users\<username>\Documents contains:
'          24 subdirectories
'          16 files

Opmerkingen

.NET biedt twee factory's voor het maken en plannen van taken:

  • De TaskFactory klasse, die objecten maakt en Task<TResult> objecten maaktTask. U kunt de overbelastingen van deze methode aanroepen om een taak te maken en uit te voeren waarvoor niet-standaardargumenten zijn vereist.

    Warning

    Vanaf .NET Framework 4.5 biedt de methode Task.Run de eenvoudigste manier om een taak te maken met standaardconfiguratiewaarden en deze onmiddellijk te starten.

  • De TaskFactory<TResult> klasse, waarmee objecten worden gemaakt Task<TResult> .

Met de TaskFactory klasse kunt u het volgende doen:

  • Maak een taak en start deze onmiddellijk door de StartNew methode aan te roepen.

    Warning

    Vanaf .NET Framework 4.5 biedt de methode Task.Run de eenvoudigste manier om een taak te maken met standaardconfiguratiewaarden en deze onmiddellijk te starten.

  • Maak een taak die begint wanneer een van de taken in een matrix is voltooid door de methode aan te ContinueWhenAny roepen.

  • Maak een taak die begint wanneer alle taken in een matrix zijn voltooid door de methode aan te ContinueWhenAll roepen.

De statische Task<TResult>.Factory eigenschap retourneert een standaardobject TaskFactory<TResult> . U kunt ook een van de TaskFactory klasseconstructors aanroepen om de Task objecten te configureren die door de TaskFactory klasse worden gemaakt. In het volgende voorbeeld wordt een nieuw TaskFactory object geconfigureerd voor het maken van taken met een opgegeven annuleringstoken, opties voor het maken van taken, vervolgopties en een aangepaste taakplanner.

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

class Example
{
   static CancellationTokenSource cts = new CancellationTokenSource();

   static TaskFactory factory = new TaskFactory(
      cts.Token,
      TaskCreationOptions.PreferFairness,
      TaskContinuationOptions.ExecuteSynchronously,
      new CustomScheduler());

   static void Main()
   {
      var t2 = factory.StartNew(() => DoWork());
      cts.Dispose();
   }

   static void DoWork() {/*...*/ }
}
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Public Sub Main()
      Dim cts As New CancellationTokenSource()
      Dim factory As New TaskFactory(cts.Token,
                                     TaskCreationOptions.PreferFairness,
                                     TaskContinuationOptions.ExecuteSynchronously,
                                     New CustomScheduler())

      Dim t2 = factory.StartNew(Sub() DoWork())
      cts.Dispose()
   End Sub

   Sub DoWork()
      ' ...
   End Sub
End Module

In de meeste gevallen hoeft u geen instantie van een nieuw TaskFactory exemplaar te maken. In plaats daarvan kunt u de Task.Factory eigenschap gebruiken, die een fabrieksobject retourneert dat gebruikmaakt van standaardwaarden. Vervolgens kunt u de methoden aanroepen om nieuwe taken te starten of taakvervolgingen te definiƫren. Zie het voorbeeld voor een afbeelding.

Constructors

Name Description
TaskFactory()

Initialiseert een TaskFactory exemplaar met de standaardconfiguratie.

TaskFactory(CancellationToken, TaskCreationOptions, TaskContinuationOptions, TaskScheduler)

Initialiseert een TaskFactory exemplaar met de opgegeven configuratie.

TaskFactory(CancellationToken)

Initialiseert een TaskFactory exemplaar met de opgegeven configuratie.

TaskFactory(TaskCreationOptions, TaskContinuationOptions)

Initialiseert een TaskFactory exemplaar met de opgegeven configuratie.

TaskFactory(TaskScheduler)

Initialiseert een TaskFactory exemplaar met de opgegeven configuratie.

Eigenschappen

Name Description
CancellationToken

Hiermee wordt het standaardannuleringstoken voor deze taakfactory opgehaald.

ContinuationOptions

Hiermee haalt u de standaardopties voor taakvervolging voor deze taakfactory op.

CreationOptions

Hiermee haalt u de standaardopties voor het maken van taken voor deze taakfactory op.

Scheduler

Hiermee haalt u de standaardtaakplanner voor deze taakfactory op.

Methoden

Name Description
ContinueWhenAll(Task[], Action<Task[]>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll(Task[], Action<Task[]>, CancellationToken)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll(Task[], Action<Task[]>, TaskContinuationOptions)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll(Task[], Action<Task[]>)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, CancellationToken)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>, TaskContinuationOptions)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>[],TResult>)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>[]>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>[]>, CancellationToken)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>[]>, TaskContinuationOptions)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>[]>)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TResult>(Task[], Func<Task[],TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TResult>(Task[], Func<Task[],TResult>, CancellationToken)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TResult>(Task[], Func<Task[],TResult>, TaskContinuationOptions)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAll<TResult>(Task[], Func<Task[],TResult>)

Hiermee maakt u een vervolgtaak die begint wanneer een set opgegeven taken is voltooid.

ContinueWhenAny(Task[], Action<Task>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny(Task[], Action<Task>, CancellationToken)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny(Task[], Action<Task>, TaskContinuationOptions)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny(Task[], Action<Task>)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>, CancellationToken)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>, TaskContinuationOptions)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult,TResult>(Task<TAntecedentResult>[], Func<Task<TAntecedentResult>,TResult>)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>>, CancellationToken)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>>, TaskContinuationOptions)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[], Action<Task<TAntecedentResult>>)

Hiermee maakt u een vervolg Task die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TResult>(Task[], Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TResult>(Task[], Func<Task,TResult>, CancellationToken)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TResult>(Task[], Func<Task,TResult>, TaskContinuationOptions)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

ContinueWhenAny<TResult>(Task[], Func<Task,TResult>)

Hiermee maakt u een vervolg Task<TResult> die wordt gestart na het voltooien van een taak in de opgegeven set.

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object, TaskCreationOptions)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync(Func<AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, Object)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync(IAsyncResult, Action<IAsyncResult>, TaskCreationOptions, TaskScheduler)

Hiermee maakt u een Task actie voor een eindmethode wanneer een opgegeven IAsyncResult bewerking is voltooid.

FromAsync(IAsyncResult, Action<IAsyncResult>, TaskCreationOptions)

Hiermee maakt u een Task actie voor een eindmethode wanneer een opgegeven IAsyncResult bewerking is voltooid.

FromAsync(IAsyncResult, Action<IAsyncResult>)

Hiermee maakt u een Task actie voor een eindmethode wanneer een opgegeven IAsyncResult bewerking is voltooid.

FromAsync<TArg1,TArg2,TArg3,TResult>(Func<TArg1,TArg2,TArg3,AsyncCallback, Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, TArg3, Object, TaskCreationOptions)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TArg2,TArg3,TResult>(Func<TArg1,TArg2,TArg3,AsyncCallback, Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, TArg3, Object)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TArg2,TArg3>(Func<TArg1,TArg2,TArg3,AsyncCallback, Object,IAsyncResult>, Action<IAsyncResult>, TArg1, TArg2, TArg3, Object, TaskCreationOptions)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TArg2,TArg3>(Func<TArg1,TArg2,TArg3,AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, TArg1, TArg2, TArg3, Object)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TArg2,TResult>(Func<TArg1,TArg2,AsyncCallback, Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, Object, TaskCreationOptions)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TArg2,TResult>(Func<TArg1,TArg2,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, TArg2, Object)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TArg2>(Func<TArg1,TArg2,AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, TArg1, TArg2, Object, TaskCreationOptions)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TArg2>(Func<TArg1,TArg2,AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, TArg1, TArg2, Object)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TResult>(Func<TArg1,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, Object, TaskCreationOptions)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1,TResult>(Func<TArg1,AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, TArg1, Object)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1>(Func<TArg1,AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, TArg1, Object, TaskCreationOptions)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TArg1>(Func<TArg1,AsyncCallback,Object,IAsyncResult>, Action<IAsyncResult>, TArg1, Object)

Hiermee maakt u een Task methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TResult>(Func<AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, Object, TaskCreationOptions)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TResult>(Func<AsyncCallback,Object,IAsyncResult>, Func<IAsyncResult,TResult>, Object)

Hiermee maakt u een Task<TResult> methode die een paar begin- en eindmethoden vertegenwoordigt die voldoen aan het Asynchrone programmeermodelpatroon.

FromAsync<TResult>(IAsyncResult, Func<IAsyncResult,TResult>, TaskCreationOptions, TaskScheduler)

Hiermee maakt u een Task<TResult> functie voor een eindmethode wanneer een opgegeven IAsyncResult bewerking is voltooid.

FromAsync<TResult>(IAsyncResult, Func<IAsyncResult,TResult>, TaskCreationOptions)

Hiermee maakt u een Task<TResult> functie voor een eindmethode wanneer een opgegeven IAsyncResult bewerking is voltooid.

FromAsync<TResult>(IAsyncResult, Func<IAsyncResult,TResult>)

Hiermee maakt u een Task<TResult> functie voor een eindmethode wanneer een opgegeven IAsyncResult bewerking is voltooid.

GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
StartNew(Action, CancellationToken, TaskCreationOptions, TaskScheduler)

Hiermee maakt en start u een taak voor de opgegeven actie gedelegeerde, annuleringstoken, opties voor maken en status.

StartNew(Action, CancellationToken)

Hiermee maakt en start u een taak voor de opgegeven actie gedelegeerde en annuleringstoken.

StartNew(Action, TaskCreationOptions)

Hiermee maakt u een taak voor de opgegeven actiedelegatie en maakopties.

StartNew(Action)

Hiermee maakt en start u een taak voor de opgegeven actiedelegen.

StartNew(Action<Object>, Object, CancellationToken, TaskCreationOptions, TaskScheduler)

Hiermee maakt en start u een taak voor de opgegeven actie gedelegeerde, status, annuleringstoken, opties voor het maken en de taakplanner.

StartNew(Action<Object>, Object, CancellationToken)

Hiermee maakt en start u een taak voor de opgegeven actie gedelegeerde, status en annuleringstoken.

StartNew(Action<Object>, Object, TaskCreationOptions)

Hiermee maakt en start u een taak voor de opgegeven actie gedelegeerde, status- en aanmaakopties.

StartNew(Action<Object>, Object)

Hiermee maakt en start u een taak voor de opgegeven actiedelegen en -status.

StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions, TaskScheduler)

Hiermee maakt en start u een taak van het type TResult voor de opgegeven functiedelegatie, status, annuleringstoken, aanmaakopties en taakplanner.

StartNew<TResult>(Func<Object,TResult>, Object, CancellationToken)

Hiermee maakt en start u een taak van het type TResult voor de opgegeven functie gedelegeerde, status en annuleringstoken.

StartNew<TResult>(Func<Object,TResult>, Object, TaskCreationOptions)

Hiermee maakt en start u een taak van het type TResult voor de opgegeven functiedelegatie, status- en aanmaakopties.

StartNew<TResult>(Func<Object,TResult>, Object)

Hiermee maakt en start u een taak van het type TResult voor de opgegeven functie gedelegeerde en status.

StartNew<TResult>(Func<TResult>, CancellationToken, TaskCreationOptions, TaskScheduler)

Hiermee maakt en start u een taak van het type TResult voor de opgegeven functiedelegatie, annuleringstoken, opties voor het maken van taken en taakplanner.

StartNew<TResult>(Func<TResult>, CancellationToken)

Hiermee maakt en start u een taak van het type TResult voor de opgegeven functie gedelegeerde en annuleringstoken.

StartNew<TResult>(Func<TResult>, TaskCreationOptions)

Hiermee maakt u een taak van het type TResult voor de opgegeven functiedelegatie en maakopties.

StartNew<TResult>(Func<TResult>)

Hiermee maakt u een taak van het type TResult voor de opgegeven functiedelegen.

ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)

Van toepassing op

Veiligheid thread

Alle openbare en beveiligde leden van TaskFactory zijn thread-veilig en kunnen gelijktijdig worden gebruikt vanuit meerdere threads.

Zie ook