İş parçacıklarını duraklatma ve kesintiye uğratma
İş parçacıklarının etkinliklerini eşitlemenin en yaygın yolları, iş parçacıklarını engellemek ve serbest bırakmak ya da nesneleri veya 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, bekleme durumlarından ayırmak için bir ThreadInterruptedException kullanabilirsiniz.
Thread.Sleep yöntemi
yöntemini çağırmak Thread.Sleep , geçerli iş parçacığının milisaniye veya yönteme geçirdiğiniz zaman aralığı için hemen engellemesine neden olur ve zaman diliminin kalan kısmını başka bir iş parçacığına verir. Bu aralık geçtikten sonra, uyku iş parçacığı yürütmeyi sürdürür.
Bir iş parçacığı başka bir iş parçacığında çağrı Thread.Sleep yapamaz. Thread.Sleep her zaman geçerli iş parçacığının uyku moduna neden olan statik bir yöntemdir.
değeriyle çağırmak Thread.Sleep , bir iş parçacığının Timeout.Infinite uyku iş parçacığında yöntemini çağıran Thread.Interrupt başka bir iş parçacığı tarafından kesilene kadar veya yöntemine yapılan bir çağrıyla sonlandırılana kadar uyku moduna neden Thread.Abort olur. Aşağıdaki örnekte, uyuyan bir iş parçacığını kesmenin her iki yöntemi de gösterilmektedir.
using System;
using System.Threading;
public class Example
{
public static void Main()
{
// Interrupt a sleeping thread.
var sleepingThread = new Thread(Example.SleepIndefinitely);
sleepingThread.Name = "Sleeping";
sleepingThread.Start();
Thread.Sleep(2000);
sleepingThread.Interrupt();
Thread.Sleep(1000);
sleepingThread = new Thread(Example.SleepIndefinitely);
sleepingThread.Name = "Sleeping2";
sleepingThread.Start();
Thread.Sleep(2000);
sleepingThread.Abort();
}
private static void SleepIndefinitely()
{
Console.WriteLine("Thread '{0}' about to sleep indefinitely.",
Thread.CurrentThread.Name);
try {
Thread.Sleep(Timeout.Infinite);
}
catch (ThreadInterruptedException) {
Console.WriteLine("Thread '{0}' awoken.",
Thread.CurrentThread.Name);
}
catch (ThreadAbortException) {
Console.WriteLine("Thread '{0}' aborted.",
Thread.CurrentThread.Name);
}
finally
{
Console.WriteLine("Thread '{0}' executing finally block.",
Thread.CurrentThread.Name);
}
Console.WriteLine("Thread '{0} finishing normal execution.",
Thread.CurrentThread.Name);
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.
//
// Thread 'Sleeping2' about to sleep indefinitely.
// Thread 'Sleeping2' aborted.
// Thread 'Sleeping2' executing finally block.
Imports System.Threading
Module Example
Public Sub Main()
' Interrupt a sleeping thread.
Dim sleepingThread = New Thread(AddressOf Example.SleepIndefinitely)
sleepingThread.Name = "Sleeping"
sleepingThread.Start()
Thread.Sleep(2000)
sleepingThread.Interrupt()
Thread.Sleep(1000)
sleepingThread = New Thread(AddressOf Example.SleepIndefinitely)
sleepingThread.Name = "Sleeping2"
sleepingThread.Start()
Thread.Sleep(2000)
sleepingThread.Abort()
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)
Catch ex As ThreadAbortException
Console.WriteLine("Thread '{0}' aborted.",
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.
'
' Thread 'Sleeping2' about to sleep indefinitely.
' Thread 'Sleeping2' aborted.
' Thread 'Sleeping2' executing finally block.
İş parçacıklarını kesme
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ığının öğesini yakalaması ThreadInterruptedException ve çalışmaya devam etmek için uygun olan her şeyi yapması gerekir. İş parçacığı özel durumu yoksayarsa, çalışma zamanı özel durumu yakalar ve iş parçacığını durdurur.
Not
Hedef iş parçacığı çağrıldığında Thread.Interrupt engellenmiyorsa, iş parçacığı engellenene kadar kesintiye uğramaz. İş parçacığı hiçbir zaman engellemezse, kesintiye uğramadan tamamlanabilir.
Bekleme, yönetilen bir bekleme Thread.Interrupt ise ve Thread.Abort her ikisi de iş parçacığını hemen uyandırır. Bekleme, yönetilmeyen bir bekleme ise (örneğin, bir platform Win32 WaitForSingleObject işlevine çağrı çağırır), yönetilen Thread.Interrupt Thread.Abort koda dönene veya kodu çağırana kadar iş parçacığının denetimini alamaz. Yönetilen kodda davranış aşağıdaki gibidir:
Thread.Interrupt bir iş parçacığını içinde olabileceği herhangi bir beklemeden uyandırır ve hedef iş parçacığında bir ThreadInterruptedException atılması neden 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ıklarını yok etme.