Udostępnij za pośrednictwem


TaskFactory Klasa

Definicja

Zapewnia obsługę tworzenia i planowania Task obiektów.

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

Przykłady

W poniższym przykładzie użyto właściwości statycznej Factory , aby wykonać dwa wywołania TaskFactory.StartNew metody . Pierwszy wypełnia tablicę nazwami plików w katalogu MyDocuments użytkownika, a drugi wypełnia tablicę nazwami podkatalogów katalogu MyDocuments użytkownika. Następnie wywołuje metodę TaskFactory.ContinueWhenAll(Task[], Action<Task[]>) , która wyświetla informacje o liczbie plików i katalogów w dwóch tablicach po zakończeniu wykonywania pierwszych dwóch zadań.

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

Uwagi

Platforma .NET udostępnia dwie fabryki do tworzenia i planowania zadań:

  • Klasa TaskFactory , która tworzy Task obiekty i Task<TResult> . Możesz wywołać przeciążenia tej metody, aby utworzyć i wykonać zadanie, które wymaga argumentów innych niż domyślne.

    Ostrzeżenie

    Począwszy od .NET Framework 4.5, Task.Run metoda zapewnia najprostszy sposób utworzenia zadania z domyślnymi wartościami konfiguracji i natychmiastowego uruchomienia.

  • Klasa TaskFactory<TResult> , która tworzy Task<TResult> obiekty.

Klasa TaskFactory umożliwia wykonanie następujących czynności:

  • Utwórz zadanie i uruchom je natychmiast, wywołując metodę StartNew .

    Ostrzeżenie

    Począwszy od .NET Framework 4.5, Task.Run metoda zapewnia najprostszy sposób utworzenia zadania z domyślnymi wartościami konfiguracji i natychmiastowego uruchomienia.

  • Utwórz zadanie uruchamiane po ukończeniu jednego z zadań w tablicy przez wywołanie ContinueWhenAny metody .

  • Utwórz zadanie uruchamiane po zakończeniu wszystkich zadań w tablicy przez wywołanie ContinueWhenAll metody .

Właściwość statyczna Task<TResult>.Factory zwraca obiekt domyślny TaskFactory<TResult> . Można również wywołać jeden z TaskFactory konstruktorów klas, aby skonfigurować Task obiekty tworzone przez klasę TaskFactory . Poniższy przykład umożliwia skonfigurowanie nowego TaskFactory obiektu w celu utworzenia zadań z określonym tokenem anulowania, opcjami tworzenia zadań, opcjami kontynuacji i dostosowanym harmonogramem zadań.

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

W większości przypadków nie trzeba utworzyć wystąpienia nowego TaskFactory wystąpienia. Zamiast tego można użyć Task.Factory właściwości , która zwraca obiekt fabryki, który używa wartości domyślnych. Następnie można wywołać jego metody, aby uruchomić nowe zadania lub zdefiniować kontynuacje zadań. Aby zapoznać się z ilustracją, zobacz przykład.

Konstruktory

TaskFactory()

Inicjuje TaskFactory wystąpienie z konfiguracją domyślną.

TaskFactory(CancellationToken)

Inicjuje TaskFactory wystąpienie z określoną konfiguracją.

TaskFactory(CancellationToken, TaskCreationOptions, TaskContinuationOptions, TaskScheduler)

Inicjuje TaskFactory wystąpienie z określoną konfiguracją.

TaskFactory(TaskCreationOptions, TaskContinuationOptions)

Inicjuje TaskFactory wystąpienie z określoną konfiguracją.

TaskFactory(TaskScheduler)

Inicjuje TaskFactory wystąpienie z określoną konfiguracją.

Właściwości

CancellationToken

Pobiera domyślny token anulowania dla tej fabryki zadań.

ContinuationOptions

Pobiera domyślne opcje kontynuacji zadań dla tej fabryki zadań.

CreationOptions

Pobiera domyślne opcje tworzenia zadań dla tej fabryki zadań.

Scheduler

Pobiera domyślny harmonogram zadań dla tej fabryki zadań.

Metody

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

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

Tworzy zadanie kontynuacji uruchamiane po zakończeniu zestawu określonych zadań.

ContinueWhenAny(Task[], Action<Task>)

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

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

Tworzy kontynuację Task<TResult> , która zostanie uruchomiona po zakończeniu dowolnego zadania w podanym zestawie.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

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

Tworzy obiekt Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem asynchronicznego modelu programowania.

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

Tworzy element Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

FromAsync(IAsyncResult, Action<IAsyncResult>)

Tworzy obiekt Task , który wykonuje akcję metody końcowej po zakończeniu określonej IAsyncResult metody.

FromAsync(IAsyncResult, Action<IAsyncResult>, TaskCreationOptions)

Tworzy obiekt Task , który wykonuje akcję metody końcowej po zakończeniu określonej IAsyncResult metody.

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

Tworzy element Task , który wykonuje akcję metody końcowej po zakończeniu określonego IAsyncResult .

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

Tworzy element Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy element Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy element Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy element Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy element Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy element Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy obiekt Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem asynchronicznego modelu programowania.

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

Tworzy obiekt Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem asynchronicznego modelu programowania.

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

Tworzy obiekt Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem asynchronicznego modelu programowania.

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

Tworzy obiekt Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem asynchronicznego modelu programowania.

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

Tworzy element Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy element Task reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy element Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem modelu programowania asynchronicznego.

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

Tworzy obiekt Task<TResult> reprezentujący parę metod początkowych i końcowych, które są zgodne ze wzorcem asynchronicznego modelu programowania.

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

Tworzy obiekt Task<TResult> , który wykonuje funkcję metody końcowej po zakończeniu określonego IAsyncResult .

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

Tworzy obiekt Task<TResult> , który wykonuje funkcję metody końcowej po zakończeniu określonego IAsyncResult .

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

Tworzy obiekt Task<TResult> , który wykonuje funkcję metody końcowej po zakończeniu określonego IAsyncResult procesu.

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
StartNew(Action)

Tworzy i uruchamia zadanie dla określonego delegata akcji.

StartNew(Action, CancellationToken)

Tworzy i uruchamia zadanie dla określonego delegata akcji i tokenu anulowania.

StartNew(Action, CancellationToken, TaskCreationOptions, TaskScheduler)

Tworzy i uruchamia zadanie dla określonego delegata akcji, tokenu anulowania, opcji tworzenia i stanu.

StartNew(Action, TaskCreationOptions)

Tworzy i uruchamia zadanie dla określonego delegata akcji i opcji tworzenia.

StartNew(Action<Object>, Object)

Tworzy i uruchamia zadanie dla określonego delegata i stanu akcji.

StartNew(Action<Object>, Object, CancellationToken)

Tworzy i uruchamia zadanie dla określonego delegata akcji, stanu i tokenu anulowania.

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

Tworzy i uruchamia zadanie dla określonego delegata akcji, stanu, tokenu anulowania, opcji tworzenia i harmonogramu zadań.

StartNew(Action<Object>, Object, TaskCreationOptions)

Tworzy i uruchamia zadanie dla określonego delegata akcji, stanu i opcji tworzenia.

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

Tworzy i uruchamia zadanie typu TResult dla określonego delegata i stanu funkcji.

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

Tworzy i uruchamia zadanie typu TResult dla określonego delegata funkcji, stanu i tokenu anulowania.

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

Tworzy i uruchamia zadanie typu TResult dla określonego delegata funkcji, stanu, tokenu anulowania, opcji tworzenia i harmonogramu zadań.

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

Tworzy i uruchamia zadanie typu TResult dla określonego delegata funkcji, stanu i opcji tworzenia.

StartNew<TResult>(Func<TResult>)

Tworzy i uruchamia zadanie typu TResult dla określonego delegata funkcji.

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

Tworzy i uruchamia zadanie typu TResult dla określonego delegata funkcji i token anulowania.

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

Tworzy i uruchamia zadanie typu TResult dla określonego delegata funkcji, token anulowania, opcje tworzenia i harmonogram zadań.

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

Tworzy i uruchamia zadanie typu TResult dla określonego delegata funkcji i opcji tworzenia.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy

Bezpieczeństwo wątkowe

Wszystkie publiczne i chronione elementy członkowskie są TaskFactory bezpieczne wątkowo i mogą być używane współbieżnie z wielu wątków.

Zobacz też