Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İş 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:
Thread.Interrupt bir iş parçacığını olası herhangi bir beklemeden uyandırır ve hedef iş parçacığında bir ThreadInterruptedException fırlatılmasına sebep olur.
Yalnızca .NET Framework: Thread.Abort bir iş parçacığını içinde olabileceği herhangi bir bekleme durumundan uyandırır ve iş parçacığında bir ThreadAbortException atılması neden olur. Ayrıntılar için bkz. İş parçacığı yok etme ve SYSLIB0006: Thread.Abort desteklenmiyor.