Task<TResult> Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Reprezentuje operację asynchroniczną, która może zwrócić wartość.
generic <typename TResult>
public ref class Task : System::Threading::Tasks::Task
public class Task<TResult> : System.Threading.Tasks.Task
type Task<'Result> = class
inherit Task
Public Class Task(Of TResult)
Inherits Task
Parametry typu
- TResult
Typ wyniku wygenerowanego przez ten Task<TResult>element .
- Dziedziczenie
Uwagi
Klasa Task<TResult> reprezentuje pojedynczą operację, która zwraca wartość i zwykle wykonuje asynchronicznie. Task<TResult> obiekty są jednym z głównych składników wzorca asynchronicznego opartego na zadaniach po raz pierwszy wprowadzonego w programie .NET Framework 4. Ponieważ praca wykonywana przez Task<TResult> obiekt, zwykle wykonywa się asynchronicznie w wątku z puli wątków, a nie synchronicznie w głównym wątku aplikacji, można użyć Status właściwości, a także IsCanceled właściwości, IsCompleted, i IsFaulted, aby określić stan zadania. Najczęściej wyrażenie lambda służy do określania pracy, którą ma wykonać zadanie.
Task<TResult> wystąpienia mogą być tworzone na różne sposoby. Najbardziej typowym podejściem, które jest dostępne, począwszy od programu .NET Framework 4.5, jest wywołanie metody statycznej Task.Run<TResult>(Func<TResult>) lub Task.Run<TResult>(Func<TResult>, CancellationToken) . Te metody zapewniają prosty sposób uruchamiania zadania przy użyciu wartości domyślnych i bez uzyskiwania dodatkowych parametrów. W poniższym przykładzie użyto Task.Run<TResult>(Func<TResult>) metody, aby uruchomić zadanie, które wykonuje iteracje pętli, a następnie wyświetla liczbę iteracji pętli.
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var t = Task<int>.Run( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
}
}
return ctr;
} );
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
}
}
// The example displays output like the following:
// Finished 1,000,001 loop iterations.
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t As Task(Of Integer) = Task.Run(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Next
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays the following output:
' Finished 1,000,001 loop iterations
Alternatywą i najczęstszym sposobem uruchamiania zadania w programie .NET Framework 4 jest wywołanie metody lub TaskFactory<TResult>.StartNew statycznejTaskFactory.StartNew. Właściwość Task.Factory zwraca TaskFactory obiekt, a Task<TResult>.Factory właściwość zwraca TaskFactory<TResult> obiekt. Przeciążenia ich StartNew metody umożliwiają przekazywanie argumentów, definiowanie opcji tworzenia zadań i określanie harmonogramu zadań. W poniższym przykładzie użyto TaskFactory<TResult>.StartNew(Func<TResult>) metody do uruchomienia zadania. Jest ona funkcjonalnie równoważna kodowi w poprzednim przykładzie.
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var t = Task<int>.Factory.StartNew( () => {
// Just loop.
int max = 1000000;
int ctr = 0;
for (ctr = 0; ctr <= max; ctr++) {
if (ctr == max / 2 && DateTime.Now.Hour <= 12) {
ctr++;
break;
}
}
return ctr;
} );
Console.WriteLine("Finished {0:N0} iterations.", t.Result);
}
}
// The example displays the following output:
// Finished 1000001 loop iterations
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim t = Task(Of Integer).Factory.StartNew(Function()
Dim max As Integer = 1000000
Dim ctr As Integer
For ctr = 0 to max
If ctr = max \ 2 And Date.Now.Hour <= 12 Then
ctr += 1
Exit For
End If
Next
Return ctr
End Function)
Console.WriteLine("Finished {0:N0} iterations.", t.Result)
End Sub
End Module
' The example displays output like the following:
' Finished 1,000,001 iterations
Aby uzyskać więcej kompletnych przykładów, zobacz Programowanie asynchroniczne oparte na zadaniach.
Klasa Task<TResult> udostępnia również konstruktory, które inicjują zadanie, ale nie planują go do wykonania. Ze względów Task.Run wydajności metody i Task.Factory.StartNew są preferowanymi mechanizmami tworzenia i planowania zadań obliczeniowych, ale w scenariuszach, w których tworzenie i planowanie zadań musi być oddzielone, konstruktory mogą być używane, a metoda zadania może być następnie używana do planowania zadania Start pod kątem wykonania w późniejszym czasie.
Począwszy od aplikacji klasycznych przeznaczonych dla platformy .NET Framework 4.6, kultura wątku tworzącego i wywołującego zadanie staje się częścią kontekstu wątku. Oznacza to, że niezależnie od bieżącej kultury wątku, na którym wykonuje zadanie, bieżąca kultura zadania jest kulturą wątku wywołującego. W przypadku aplikacji przeznaczonych dla wersji programu .NET Framework wcześniejszych niż .NET Framework 4.6 kultura zadania jest kulturą wątku, na którym wykonuje zadanie. Aby uzyskać więcej informacji, zobacz sekcję "Operacje asynchroniczne oparte na kulturze i zadaniach" w temacie CultureInfo . Pamiętaj, że aplikacje ze Sklepu są zgodne ze środowiskiem uruchomieniowym systemu Windows w ustawieniu i uzyskiwaniu kultury domyślnej.
W przypadku operacji, które nie zwracają wartości, należy użyć Task klasy . Począwszy od języka C# 7.0, w przypadku bardziej uproszczonego zadania, które jest typem wartości, a nie typem referencyjnym, użyj System.Threading.Tasks.ValueTask<TResult> struktury.
Konstruktory
| Nazwa | Opis |
|---|---|
| Task<TResult>(Func<Object,TResult>, Object, CancellationToken, TaskCreationOptions) |
Inicjuje nową Task<TResult> akcję, stan i opcje. |
| Task<TResult>(Func<Object,TResult>, Object, CancellationToken) |
Inicjuje nową Task<TResult> akcję, stan i opcje. |
| Task<TResult>(Func<Object,TResult>, Object, TaskCreationOptions) |
Inicjuje nową Task<TResult> akcję, stan i opcje. |
| Task<TResult>(Func<Object,TResult>, Object) |
Inicjuje nową Task<TResult> z określoną funkcją i stanem. |
| Task<TResult>(Func<TResult>, CancellationToken, TaskCreationOptions) |
Inicjuje nową Task<TResult> z określoną funkcją i opcjami tworzenia. |
| Task<TResult>(Func<TResult>, CancellationToken) |
Inicjuje nową Task<TResult> z określoną funkcją. |
| Task<TResult>(Func<TResult>, TaskCreationOptions) |
Inicjuje nową Task<TResult> z określoną funkcją i opcjami tworzenia. |
| Task<TResult>(Func<TResult>) |
Inicjuje nową Task<TResult> z określoną funkcją. |
Właściwości
| Nazwa | Opis |
|---|---|
| AsyncState |
Pobiera obiekt stanu podany podczas Task tworzenia obiektu lub ma wartość null, jeśli żaden z nich nie został podany. (Odziedziczone po Task) |
| CreationOptions |
Pobiera element użyty do utworzenia TaskCreationOptions tego zadania. (Odziedziczone po Task) |
| Exception |
Pobiera element AggregateException , który spowodował Task zakończenie przedwcześnie.
Task Jeśli ukończono pomyślnie lub nie zgłosił jeszcze żadnych wyjątków, zostanie zwrócony element |
| Factory |
Pobiera metodę fabryki do tworzenia i konfigurowania Task<TResult> wystąpień. |
| Id |
Pobiera identyfikator dla tego Task wystąpienia. (Odziedziczone po Task) |
| IsCanceled |
Pobiera, czy to Task wystąpienie zakończyło wykonywanie z powodu anulowania. (Odziedziczone po Task) |
| IsCompleted |
Pobiera wartość wskazującą, czy zadanie zostało ukończone. (Odziedziczone po Task) |
| IsCompletedSuccessfully |
Pobiera, czy zadanie było uruchamiane do ukończenia. (Odziedziczone po Task) |
| IsFaulted |
Pobiera informację o zakończeniu Task z powodu nieobsługiwanego wyjątku. (Odziedziczone po Task) |
| Result |
Pobiera wartość wyniku tego Task<TResult>elementu . |
| Status |
TaskStatus Pobiera to zadanie. (Odziedziczone po Task) |
Metody
| Nazwa | Opis |
|---|---|
| ConfigureAwait(Boolean) |
Konfiguruje obiekt awaiter używany do oczekiwania na ten Task<TResult>element . |
| ConfigureAwait(ConfigureAwaitOptions) |
Konfiguruje obiekt awaiter używany do oczekiwania na ten Taskelement . |
| ContinueWith(Action<Task,Object>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację, która odbiera informacje o stanie dostarczonym przez obiekt wywołujący oraz token anulowania, który jest wykonywany po zakończeniu działania obiektu docelowego Task . Kontynuacja jest wykonywana na podstawie zestawu określonych warunków i używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith(Action<Task,Object>, Object, CancellationToken) |
Tworzy kontynuację, która odbiera informacje o stanie dostarczonym przez obiekt wywołujący i token anulowania oraz wykonuje asynchronicznie po zakończeniu działania obiektu docelowego Task . (Odziedziczone po Task) |
| ContinueWith(Action<Task,Object>, Object, TaskContinuationOptions) |
Tworzy kontynuację odbierającą informacje o stanie dostarczone przez obiekt wywołujący i wykonywaną po zakończeniu działania obiektu docelowego Task . Kontynuacja jest wykonywana na podstawie zestawu określonych warunków. (Odziedziczone po Task) |
| ContinueWith(Action<Task,Object>, Object, TaskScheduler) |
Tworzy kontynuację, która odbiera informacje o stanie dostarczone przez obiekt wywołujący i wykonuje asynchronicznie po zakończeniu działania obiektu docelowego Task . Kontynuacja używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith(Action<Task,Object>, Object) |
Tworzy kontynuację odbierającą informacje o stanie dostarczone przez obiekt wywołujący i wykonywaną po zakończeniu działania obiektu docelowego Task . (Odziedziczone po Task) |
| ContinueWith(Action<Task<TResult>,Object>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith(Action<Task<TResult>,Object>, Object, CancellationToken) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith(Action<Task<TResult>,Object>, Object, TaskContinuationOptions) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith(Action<Task<TResult>,Object>, Object, TaskScheduler) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith(Action<Task<TResult>,Object>, Object) |
Tworzy kontynuację przekazywaną informację o stanie i wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith(Action<Task<TResult>>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację, która jest wykonywana zgodnie z warunkiem określonym w |
| ContinueWith(Action<Task<TResult>>, CancellationToken) |
Tworzy kontynuację z możliwością anulowania, która jest wykonywana asynchronicznie po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith(Action<Task<TResult>>, TaskContinuationOptions) |
Tworzy kontynuację, która jest wykonywana zgodnie z warunkiem określonym w |
| ContinueWith(Action<Task<TResult>>, TaskScheduler) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu elementu docelowego Task<TResult> . |
| ContinueWith(Action<Task<TResult>>) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu zadania docelowego. |
| ContinueWith(Action<Task>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację wykonywaną, gdy zadanie docelowe konkuruje zgodnie z określonym TaskContinuationOptionselementem . Kontynuacja odbiera token anulowania i używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith(Action<Task>, CancellationToken) |
Tworzy kontynuację, która odbiera token anulowania i wykonuje asynchronicznie po zakończeniu działania obiektu docelowego Task . (Odziedziczone po Task) |
| ContinueWith(Action<Task>, TaskContinuationOptions) |
Tworzy kontynuację wykonywaną po zakończeniu zadania docelowego zgodnie z określonym TaskContinuationOptionselementem . (Odziedziczone po Task) |
| ContinueWith(Action<Task>, TaskScheduler) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu elementu docelowego Task . Kontynuacja używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith(Action<Task>) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu elementu docelowego Task . (Odziedziczone po Task) |
| ContinueWith<TNewResult>(Func<Task<TResult>,Object,TNewResult>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith<TNewResult>(Func<Task<TResult>,Object,TNewResult>, Object, CancellationToken) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith<TNewResult>(Func<Task<TResult>,Object,TNewResult>, Object, TaskContinuationOptions) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith<TNewResult>(Func<Task<TResult>,Object,TNewResult>, Object, TaskScheduler) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith<TNewResult>(Func<Task<TResult>,Object,TNewResult>, Object) |
Tworzy kontynuację wykonywaną po zakończeniu działania obiektu docelowego Task<TResult> . |
| ContinueWith<TNewResult>(Func<Task<TResult>,TNewResult>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację, która jest wykonywana zgodnie z warunkiem określonym w |
| ContinueWith<TNewResult>(Func<Task<TResult>,TNewResult>, CancellationToken) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu elementu docelowego Task<TResult> . |
| ContinueWith<TNewResult>(Func<Task<TResult>,TNewResult>, TaskContinuationOptions) |
Tworzy kontynuację, która jest wykonywana zgodnie z warunkiem określonym w |
| ContinueWith<TNewResult>(Func<Task<TResult>,TNewResult>, TaskScheduler) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu elementu docelowego Task<TResult> . |
| ContinueWith<TNewResult>(Func<Task<TResult>,TNewResult>) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu elementu docelowego Task<TResult> . |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację, która jest wykonywana na podstawie określonych opcji kontynuacji zadania po zakończeniu elementu docelowego Task i zwraca wartość. Kontynuacja odbiera informacje o stanie dostarczone przez obiekt wywołujący i token anulowania i używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, CancellationToken) |
Tworzy kontynuację, która jest wykonywana asynchronicznie po zakończeniu elementu docelowego Task i zwraca wartość. Kontynuacja odbiera informacje o stanie dostarczone przez obiekt wywołujący i token anulowania. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskContinuationOptions) |
Tworzy kontynuację, która jest wykonywana na podstawie określonych opcji kontynuacji zadania po zakończeniu elementu docelowego Task . Kontynuacja odbiera informacje o stanie dostarczone przez obiekt wywołujący. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object, TaskScheduler) |
Tworzy kontynuację wykonywaną asynchronicznie po zakończeniu elementu docelowego Task . Kontynuacja odbiera informacje o stanie dostarczone przez obiekt wywołujący i używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,Object,TResult>, Object) |
Tworzy kontynuację, która odbiera informacje o stanie dostarczone przez obiekt wywołujący i wykonuje asynchronicznie po zakończeniu elementu docelowego Task i zwraca wartość. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,TResult>, CancellationToken, TaskContinuationOptions, TaskScheduler) |
Tworzy kontynuację wykonywaną zgodnie z określonymi opcjami kontynuacji i zwraca wartość. Kontynuacja jest przekazywana token anulowania i używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,TResult>, CancellationToken) |
Tworzy kontynuację, która jest wykonywana asynchronicznie po zakończeniu elementu docelowego Task i zwraca wartość. Kontynuacja otrzymuje token anulowania. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,TResult>, TaskContinuationOptions) |
Tworzy kontynuację wykonywaną zgodnie z określonymi opcjami kontynuacji i zwraca wartość. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,TResult>, TaskScheduler) |
Tworzy kontynuację, która jest wykonywana asynchronicznie po zakończeniu elementu docelowego Task i zwraca wartość. Kontynuacja używa określonego harmonogramu. (Odziedziczone po Task) |
| ContinueWith<TResult>(Func<Task,TResult>) |
Tworzy kontynuację, która jest wykonywana asynchronicznie po zakończeniu elementu docelowego Task<TResult> i zwraca wartość. (Odziedziczone po Task) |
| Dispose() |
Zwalnia wszystkie zasoby używane przez bieżące wystąpienie Task klasy. (Odziedziczone po Task) |
| Dispose(Boolean) |
Usuwa element Task, zwalniając wszystkie niezarządzane zasoby. (Odziedziczone po Task) |
| Equals(Object) |
Określa, czy określony obiekt jest równy bieżącemu obiektowi. (Odziedziczone po Object) |
| GetAwaiter() |
Pobiera element awaiter używany do oczekiwania na ten Task<TResult>element . |
| GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
| GetType() |
Pobiera Type bieżącego wystąpienia. (Odziedziczone po Object) |
| MemberwiseClone() |
Tworzy płytkią kopię bieżącego Object. (Odziedziczone po Object) |
| RunSynchronously() |
Task Uruchamia synchronicznie TaskSchedulerbieżący element . (Odziedziczone po Task) |
| RunSynchronously(TaskScheduler) |
Task Uruchamia synchronicznie w podanym obszarzeTaskScheduler. (Odziedziczone po Task) |
| Start() |
Uruchamia element Task, planując jego wykonanie do bieżącego TaskSchedulerelementu . (Odziedziczone po Task) |
| Start(TaskScheduler) |
Uruchamia element Task, planując jego wykonanie do określonego TaskSchedulerelementu . (Odziedziczone po Task) |
| ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
| Wait() |
Czeka na Task ukończenie wykonywania. (Odziedziczone po Task) |
| Wait(CancellationToken) |
Czeka na Task ukończenie wykonywania. Oczekiwanie kończy się, jeśli token anulowania zostanie anulowany przed ukończeniem zadania. (Odziedziczone po Task) |
| Wait(Int32, CancellationToken) |
Czeka na Task ukończenie wykonywania. Oczekiwanie kończy się, jeśli upłynie interwał limitu czasu lub token anulowania zostanie anulowany przed ukończeniem zadania. (Odziedziczone po Task) |
| Wait(Int32) |
Czeka na Task ukończenie wykonywania w określonej liczbie milisekund. (Odziedziczone po Task) |
| Wait(TimeSpan, CancellationToken) |
Czeka na Task ukończenie wykonywania. (Odziedziczone po Task) |
| Wait(TimeSpan) |
Czeka na Task ukończenie wykonywania w określonym przedziale czasu. (Odziedziczone po Task) |
| WaitAsync(CancellationToken) |
Pobiera element Task<TResult> , który zostanie ukończony po Task<TResult> zakończeniu lub po żądaniu anulowania określonego CancellationToken . |
| WaitAsync(TimeSpan, CancellationToken) |
Pobiera element Task<TResult> , który zostanie ukończony po Task<TResult> zakończeniu, upływie określonego limitu czasu lub po żądaniu anulowania określonego CancellationToken limitu czasu. |
| WaitAsync(TimeSpan, TimeProvider, CancellationToken) |
Pobiera element Task<TResult> , który zostanie ukończony po Task<TResult> zakończeniu, upływie określonego limitu czasu lub po żądaniu anulowania określonego CancellationToken limitu czasu. |
| WaitAsync(TimeSpan, TimeProvider) |
Pobiera element Task<TResult> , który zostanie ukończony po Task<TResult> zakończeniu lub upływie określonego limitu czasu. |
| WaitAsync(TimeSpan) |
Pobiera element Task<TResult> , który zostanie ukończony po Task<TResult> zakończeniu lub upływie określonego limitu czasu. |
Jawne implementacje interfejsu
| Nazwa | Opis |
|---|---|
| IAsyncResult.AsyncWaitHandle |
Pobiera element WaitHandle , który może służyć do oczekiwania na ukończenie zadania. (Odziedziczone po Task) |
| IAsyncResult.CompletedSynchronously |
Pobiera wskazanie, czy operacja została ukończona synchronicznie. (Odziedziczone po Task) |
Metody rozszerzania
| Nazwa | Opis |
|---|---|
| AsAsyncAction(Task) |
Zwraca akcję asynchroniczną środowiska uruchomieniowego systemu Windows reprezentującą uruchomione zadanie. |
| AsAsyncOperation<TResult>(Task<TResult>) |
Zwraca operację asynchroniczną środowiska uruchomieniowego systemu Windows reprezentującą uruchomione zadanie, które zwraca wynik. |
| DispatcherOperationWait(Task, TimeSpan) |
Czeka na określoną ilość czasu na ukończenie bazowego DispatcherOperation . |
| DispatcherOperationWait(Task) |
Czeka na ukończenie bazowego DispatcherOperation w nieskończoność. |
| IsDispatcherOperationTask(Task) |
Zwraca wartość wskazującą, czy jest to Task skojarzone z elementem DispatcherOperation. |
Dotyczy
Bezpieczeństwo wątkowe
Wszystkie elementy członkowskie , Task<TResult>z wyjątkiem Dispose(), są bezpieczne wątkowo i mogą być używane z wielu wątków jednocześnie.