Udostępnij za pośrednictwem


Wątek puli (C# i Visual Basic)

A puli wątków jest zbiorem wątków, które mogą być używane do wykonywania kilku zadań w tle.(Zobacz Wątki (C# i Visual Basic) Aby uzyskać informacje ogólne.) To pozostawia wątek główny swobodnego wykonywania innych zadań asynchronicznie.

Pule wątków często są zatrudnieni w aplikacji serwera.Każde żądanie przychodzące jest przypisany do wątku z puli wątków, więc, że żądania mogą być przetwarzane asynchronicznie, bez zajmowania wątek główny lub opóźniania przetwarzania kolejnych żądań.

Po ukończeniu zadania jego wątku w puli jest ona zwracana do kolejki wątków oczekujących, gdzie można ponownie.To ponowne aplikacjom uniknięcie kosztów tworzenia nowego wątku dla każdego zadania.

Pule wątków mają zazwyczaj maksymalna liczba wątków.Wszystkie wątki są zajęte, dodatkowe zadania są umieszczane w kolejce, dopóki nie może być obsługiwany jako wątki stają się dostępne.

Można zaimplementować puli wątków, ale jest łatwiejszy w użyciu puli wątków, świadczone przez.NET Framework poprzez ThreadPool klasy.

Z puli wątków, call ThreadPool.QueueUserWorkItem metodę z obiektu delegowanego dla procedury, które chcesz uruchomić, i Visual Basic lub C# wątek tworzy i uruchamia procedura.

Wątek puli przykład

Poniższy przykład pokazuje, jak można użyć wątek puli uruchomić kilka zadań.

Public Sub DoWork()
    ' Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf SomeLongTask))
    ' Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Private Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Private Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub
public void DoWork()
{
    // Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(SomeLongTask));
    // Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(AnotherLongTask));
}

private void SomeLongTask(Object state)
{
    // Insert code to perform a long task.
}

private void AnotherLongTask(Object state)
{
    // Insert code to perform a long task.
}

Jedną z zalet puli wątków jest, że można przekazywać argumenty w obiekcie Państwo do procedury zadania.Jeśli procedura wywołujesz wymaga więcej niż jeden argument, można rzutować strukturę lub instancję klasy do Object typu danych.

Parametry puli wątków i wartości zwracane

Zwracanie wartości z wątku puli wątków nie jest proste.Standardowy sposób zwracanie wartości z wywołania funkcji nie jest dozwolone, ponieważ Sub procedury są jedynym rodzajem procedury, które można umieścić w kolejce do puli wątków.Jednym ze sposobów umożliwiają parametry, wartości zwracane jest zawijania parametrów zwracane wartości i metod w owinięcie klasy zgodnie z opisem w Parametry i wartości zwracane w przypadku procedur wielowątkowej (C# i Visual Basic).

Easer sposób dostarczyć parametrów i zwracają wartości jest przy użyciu opcjonalnej ByVal stanu zmiennej obiektu QueueUserWorkItem metody.Jeśli przekazuje odwołanie do instancji klasy za pomocą tej zmiennej członków instancji można modyfikować przez wątek puli wątków i używane jako wartości zwracane.

Na początku może nie być oczywiste, że można modyfikować obiekt określoną przez zmienną, która jest przekazywany przez wartość.Można to zrobić, ponieważ tylko odwołanie do obiektu jest przekazywany przez wartość.Po wprowadzeniu zmian do członków obiektu określonego przez odwołanie do obiektu, zmiany odnoszą się do instancji klasy rzeczywiste.

Struktury nie można użyć do zwracania wartości wewnątrz obiektów Państwo.Ponieważ struktury są typy wartości, zmiany, które sprawia, że proces asynchroniczny nie należy zmieniać elementy oryginalnej struktury.Za pomocą struktury udzielać parametrów wartości zwracanej nie są potrzebne.

Zobacz też

Zadania

Jak: użycie puli wątków (C# i Visual Basic)

Informacje

Wątek synchronizacji (C# i Visual Basic)

QueueUserWorkItem

System.Threading

ThreadPool

Koncepcje

Aplikacje wielowątkowe (C# i Visual Basic)

Inne zasoby

Wątki (C# i Visual Basic)

JAK: Prześlij element roboczy puli wątków, przy użyciu programu Visual C#