Aracılığıyla paylaş


İş parçacıklarını duraklatma ve durdurma

İş parçacıklarının etkinliklerini eşitlemenin en yaygın yolları, iş parçacıklarının çalışmasını durdurup yeniden başlatmak veya nesneleri ya da kod bölgelerini kilitlemektir. Bu kilitleme ve engelleme mekanizmaları hakkında daha fazla bilgi için bkz. Eşitleme Temel Bilgilerine Genel Bakış.

Ayrıca, iş parçacıklarının kendilerini uyku moduna geçirmelerini sağlayabilirsiniz. İş parçacıkları engellendiğinde veya uykuda olduğunda, onları bekleme durumlarından kurtarmak için bir ThreadInterruptedException kullanabilirsiniz.

Thread.Sleep yöntemi

Thread.Sleep yönteminin çağrılması, geçerli iş parçacığının milisaniye veya yönteme geçtiğiniz zaman aralığı boyunca hemen duraksamasına neden olur ve kendi zaman diliminin geri kalanını başka bir iş parçacığına verir. Bu aralık geçtikten sonra uyku modundaki iş parçacığı çalışmaya devam eder.

Bir iş parçacığı, başka bir iş parçacığı üzerinde Thread.Sleep çağrısı yapamaz. Thread.Sleep her zaman geçerli iş parçacığının uyku moduna neden olan statik bir yöntemdir.

Bir iş parçacığını, başka bir iş parçacığı uyuyan iş parçacığında Thread.Sleep yöntemini çağırana kadar uyku moduna geçirmek için Timeout.Infinite değerini çağırmak, iş parçacığını uyku durumuna sokar. Aşağıdaki örnek, uyuyan bir thread'in kesilmesini gösterir.

using System;
using System.Threading;

public class Example
{
    public static void Main()
    {
        // Interrupt a sleeping thread.
        var sleepingThread = new Thread(SleepIndefinitely);
        sleepingThread.Name = "Sleeping";
        sleepingThread.Start();
        Thread.Sleep(2000);
        sleepingThread.Interrupt();
        sleepingThread.Join();
    }

    private static void SleepIndefinitely()
    {
        Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' about to sleep indefinitely.");
        try
        {
            Thread.Sleep(Timeout.Infinite);
        }
        catch (ThreadInterruptedException)
        {
            Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' awoken.");
        }
        finally
        {
            Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' executing finally block.");
        }
        Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' finishing normal execution.");
        Console.WriteLine();
    }
}
// The example displays the following output:
//       Thread 'Sleeping' about to sleep indefinitely.
//       Thread 'Sleeping' awoken.
//       Thread 'Sleeping' executing finally block.
//       Thread 'Sleeping' finishing normal execution.
Imports System.Threading

Module Example
    Public Sub Main()
        ' Interrupt a sleeping thread.
        Dim sleepingThread = New Thread(AddressOf SleepIndefinitely)
        sleepingThread.Name = "Sleeping"
        sleepingThread.Start()
        Thread.Sleep(2000)
        sleepingThread.Interrupt()
        sleepingThread.Join()
    End Sub

    Private Sub SleepIndefinitely()
        Console.WriteLine("Thread '{0}' about to sleep indefinitely.",
                          Thread.CurrentThread.Name)
        Try
            Thread.Sleep(Timeout.Infinite)
        Catch ex As ThreadInterruptedException
            Console.WriteLine("Thread '{0}' awoken.",
                              Thread.CurrentThread.Name)
        Finally
            Console.WriteLine("Thread '{0}' executing finally block.",
                              Thread.CurrentThread.Name)
        End Try
        Console.WriteLine("Thread '{0}' finishing normal execution.",
                          Thread.CurrentThread.Name)
        Console.WriteLine()
    End Sub
End Module
' The example displays the following output:
'       Thread 'Sleeping' about to sleep indefinitely.
'       Thread 'Sleeping' awoken.
'       Thread 'Sleeping' executing finally block.
'       Thread 'Sleeping' finishing normal execution.

Örnek, kesilen iş parçacığı yürütmeyi bitirene kadar çağıran iş parçacığını engeller Thread.Join.

İş parçacıklarını kesintiye uğratma

Engellenen iş parçacığında Thread.Interrupt yöntemini çağırarak bekleyen bir iş parçacığını ThreadInterruptedExceptionkesebilir ve bu da iş parçacığını engelleyici çağrıdan çıkarır. İş parçacığı, ThreadInterruptedException öğesini ele almalı ve çalışmaya devam etmek için gereken her şeyi yapmalıdır. İş parçacığı özel durumu yoksayarsa, çalışma zamanı özel durumu yakalar ve iş parçacığını durdurur.

Uyarı

Hedef iş parçacığı çağrıldığında Thread.Interrupt engellenmiyorsa, iş parçacığı engellenene kadar kesintiye uğramaz. İş parçacığı hiçbir zaman engellenmezse, kesintiye uğramadan görevini tamamlayabilir.

Bekleme yönetilen bir bekleme ise, Thread.Interrupt iş parçacığını hemen uyandırır. Bekleme, yönetilmeyen bir bekleme ise (örneğin, win32 WaitForSingleObject fonksiyonuna yapılan bir platform çağrısı), Thread.Interrupt yönetilen koda dönülene veya yönetilen kod çağrılana kadar iş parçacığının denetimini ele geçiremez. Yönetilen kodda davranış aşağıdaki gibidir:

Ayrıca bakınız