İş Parçacığı Eşitleme (C# ve Visual Basic)

Özellikleri ve çok iş parçacıklı uygulamalarda kaynaklara erişimini eşitlemek için kullanılan sınıflar aşağıdaki bölümlerde açıklanmıştır.

Birden çok iş parçacığı bir uygulamada kullanmanın yararları biri olan, her iş parçacığı eşzamansız olarak yürütür.Windows uygulamaları için uygulama penceresinin ederken arka planda gerçekleştirilecek zaman görevleri böylece ve denetimleri tepki olarak kalır.Sunucu için çoklu kullanım uygulamaları farklı bir iş parçacığı ile gelen her istek işleme yeteneği sağlar.Önceki isteği tam olarak memnun kadar Aksi takdirde, her yeni istek verilemeyen.

Ancak, zaman uyumsuz dosya tanıtıcıları, ağ bağlantıları ve bellek gibi kaynaklara erişen iş parçacığı anlamına gelir doğasına koordine edilmelidir.Aksi halde, iki ya da daha fazla i parçacıı aynı zamanda, diğer kişinin eylemlerini her farkında aynı kaynak erişebilir.Beklenmeyen veri bozulmaları olabilir.

İntegral sayısal veri türleri üzerinde basit işlemler için iş parçacıklarını eşitleme üyeleriyle gerçekleştirilebilir Interlocked sınıfı.İçin tüm diğer veri türleri ve olmayan iş parçacıklarını kaynakları, çoklu kullanım yalnızca güvenli yapıları bu konudaki kullanılarak gerçekleştirilebilir.

Çok iş parçacıklı programlama hakkında bilgi için bkz:

Kilit ve anahtar sözcükler SyncLock

lock (C#) ve SyncLock (Visual Basic) deyimi kullanılabilir kod bloğunu tamamlama kesintisiz çalışmasını sağlamak için diğer iş parçacıkları tarafından.Karşılıklı dışlama kilit belirli bir nesne için kod bloğunun süresini elde ederek gerçekleştirilir.

A lock veya SyncLock deyimi bağımsız değişken olarak bir nesne verilir ve bir defada yalnızca tek bir iş parçacığı tarafından yürütülecek bir kod bloğu arkasından.Örne?in:

Public Class TestThreading
    Dim lockThis As New Object 

    Public Sub Process()
        SyncLock lockThis
            ' Access thread-sensitive resources. 
        End SyncLock 
    End Sub 
End Class
public class TestThreading
{
    private System.Object lockThis = new System.Object();

    public void Process()
    {

        lock (lockThis)
        {
            // Access thread-sensitive resources.
        }
    }

}

Sağlanan bağımsız değişken lock anahtar nesneye bir başvuru türüne göre olmalıdır ve kilit kapsamını tanımlamak için kullanılır.Yukarıdaki örnekte, kilit kapsamı nedeniyle bu işlevi sınırlıdır nesnesine başvuru lockThis işlevin dışındaki mevcut.Böyle bir başvuru yok idiyse, o nesne için kilit kapsam uzanabilir.Kesinlikle söylemek gerekirse, sağlanan nesne yalnızca bir rasgele sınıf örneği olabilir birden çok iş parçacığı arasında paylaşılan kaynağın benzersiz olarak tanımlamak için kullanılır.Uygulamada, ancak bu nesne genellikle eşitleme hangi iş parçacığı için gerekli olan kaynak gösterir.Örneğin, bir kapsayıcı nesnesi birden çok iş parçacığı tarafından kullanılacak ise, kilitlemek için kapsayıcı sonra geçirilebilir ve kilit izleyen eşzamanlı kod bloğunu konteyner erişmek.Diğer kilitler üzerinde sürece aynı erişmeden önce içeren ve güvenli nesnelere erişim eşitlenir.

Genellikle üzerinde kilitlememek iyi bir public türü veya nesne örneklerine uygulamanıza denetiminin dışındadır.Örneğin, lock(this) dýþýndadýr kod nesne üzerinde kilit çünkü örneği genel olarak, erişilebiliyorsa sorunlu olabilir.Bu kilitlenme durumlar nerede iki ya da daha fazla i parçacıı aynı nesne sürümünü beklemeniz oluşturabilir.Bir nesneyi karşıt olarak, bir ortak veri türü üzerinde kilitleme aynı nedenden sorunlara neden olabilir.Harflerden oluşan dizeler kilitleme özellikle riskli harflerden oluşan dizeler, çünkü interned tarafından ortak dil çalışma zamanı (clr).Bunun anlamı bir örneği verilen herhangi bir dize için tüm program değişmez, tüm yerlerde tam aynı nesneyi gösteren uygulama etki alanları, tüm iş parçacıklarının üzerinde çalışan.Sonuç olarak, kilit aynı içeriği ile bir dize herhangi bir yere uygulama işlemi kilitler uygulamada bu dize tüm örneklerini yerleştirilmiş.Sonuç olarak, kilitlemek değil interned özel veya korumalı bir üye en iyisidir.Bazı sınıfları üyeleri özellikle kilitleme sağlar.Array Sağlayan türü, örneğin, SyncRoot.Birçok koleksiyon türünü sağlayan bir SyncRoot de üye.

Hakkında daha fazla bilgi için lock ve SyncLock deyimlerini, aşağıdaki konulara bakın:

Monitörler

Gibi lock ve SyncLock anahtar sözcükler, monitörler, birden çok iş parçacığı tarafından eşzamanlı yürütme kodu bloklarını önlemek.Enter Yönteminin aşağıdaki ifadeleri; devam etmek yalnızca bir iş parçacığı sağlar diğer tüm iş parçacıkları yürütme iş parçacığı aramaları kadar bloke edilir Exit.Bu yalnızca kullanmak gibi lock anahtar sözcüğü.Örne?in:

SyncLock x
    DoSomething()
End SyncLock
lock (x)
{
    DoSomething();
}

Bu aşağıdakine eşdeğerdir:

Dim obj As Object = CType(x, Object)
System.Threading.Monitor.Enter(obj)
Try
    DoSomething()
Finally
    System.Threading.Monitor.Exit(obj)
End Try
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
    DoSomething();
}
finally
{
    System.Threading.Monitor.Exit(obj);
}

Kullanarak lock (C#) veya SyncLock (Visual Basic) anahtar sözcüğü genellikle tercih edilen üzerinde Monitor her ikisi de doğrudan, çünkü sınıf lock veya SyncLock daha kısa olan ve lock veya SyncLock bile korumalı kodu bir istisna atar temel İzleyicisi serbest oluşturmasını sağlar.Bu işlem ile yapılır finally anahtar sözcüğünü olup bir istisnası atılır ne olursa olsun, ilişkili kod bloğunu yürütür.

Eşitleme olayları ve bekleme tutamaçları

Kilitli veya monitör kullanarak iş parçacığı duyarlı kod bloklarını eş zamanlı yürütülmesi korunmak için yararlıdır ancak bu yapýlarýn olaya başka bir iletişim kurmak bir iş parçacığı izin vermez.Bu gerektirir eşitleme olayları, iki durumu birine sahip nesneler oldukları sinyal verilmiş ve un-signaled, etkinleştirmek ve iş parçacığı askıya almak için kullanılabilir.İş parçacıkları unsignaled bir eşitleme olayı beklemek için yapılan tarafından askıya ve erdiği için olay durumunu değiştirerek etkinleştirilebilir.Bir iş parçacığı zaten erdiği bir olayda bekleyin çalışırsa, iş parçacığının gecikmeden yürütme devam eder.

Eşitleme olayları iki tür vardır: AutoResetEvent, ve ManualResetEvent.Yalnızca, içinde farklı AutoResetEvent değişikliklerden erdiği çok unsignaled otomatik olarak herhangi bir zaman bir iş parçacığını etkinleştirir.Bunun tersine, bir ManualResetEvent herhangi bir sinyal verilmiş durumuna göre etkinleştirilmesi için iş parçacığı sayısını verir ve yalnızca bir unsignaled döner ne zaman durum, Reset yöntemi çağrılır.

İş parçacığı olayları gibi arama bekleme yöntemlerinden biri tarafından beklemek için atölyeye WaitOne, WaitAny, veya WaitAll.WaitHandle.WaitOnetek bir olay erdiği olur kadar bekleyin iş parçacığının neden WaitHandle.WaitAny bir veya daha fazla belirtilen olaylar erdiği haline kadar bir iş parçacığı engeller ve WaitHandle.WaitAll tüm belirtilen olayları erdiği haline kadar iş parçacığı engeller.Bir olay erdiği olur, kendi Set yöntemi çağrılır.

Aşağıdaki örnekte, bir iş parçacığı oluşturulan ve başlatılan Main işlevi.Bir olayı kullanarak yeni iş parçacığı bekler WaitOne yöntemi.İş parçacığı olayı yürütülmekte birincil iş parçacığı tarafından erdiği olur kadar askıya Main işlevi.Olay erdiği olur sonra yardımcı iş parçacığı değerini döndürür.Bu durumda, olay yalnızca bir iş parçacığının etkinleştirme için ya da kullanıldığı için AutoResetEvent veya ManualResetEvent sınıfları kullanılır.

Imports System.Threading

Module Module1
    Dim autoEvent As AutoResetEvent

    Sub DoWork()
        Console.WriteLine("   worker thread started, now waiting on event...")
        autoEvent.WaitOne()
        Console.WriteLine("   worker thread reactivated, now exiting...")
    End Sub 

    Sub Main()
        autoEvent = New AutoResetEvent(False)

        Console.WriteLine("main thread starting worker thread...")
        Dim t As New Thread(AddressOf DoWork)
        t.Start()

        Console.WriteLine("main thread sleeping for 1 second...")
        Thread.Sleep(1000)

        Console.WriteLine("main thread signaling worker thread...")
        autoEvent.Set()
    End Sub 
End Module
using System;
using System.Threading;

class ThreadingExample
{
    static AutoResetEvent autoEvent;

    static void DoWork()
    {
        Console.WriteLine("   worker thread started, now waiting on event...");
        autoEvent.WaitOne();
        Console.WriteLine("   worker thread reactivated, now exiting...");
    }

    static void Main()
    {
        autoEvent = new AutoResetEvent(false);

        Console.WriteLine("main thread starting worker thread...");
        Thread t = new Thread(DoWork);
        t.Start();

        Console.WriteLine("main thread sleeping for 1 second...");
        Thread.Sleep(1000);

        Console.WriteLine("main thread signaling worker thread...");
        autoEvent.Set();
    }
}

Mutex nesnesi

A zaman uyumu sağlayıcısı benzer bir monitör için; Bu kod bloğunu eş zamanlı yürütülmesi birden fazla iş parçacığı tarafından teker teker engeller.Aslında, "dışlayan." teriminin kısaltılmış adı "mutex" olduğunu Monitörlerden farklı olarak, ancak, iş parçacığı işlemleri arasında eşitlemek için bir mutex kullanılabilir.Bir mutex tarafından temsil edilen Mutex sınıfı.

İşlemler arası eşitleme için kullanıldığında, bir mutex adlı bir mutex adlı , başka bir uygulamada kullanılmak üzere olduğundan ve bu nedenle genel veya statik değişken yoluyla paylaşılamaz.Böylece her iki uygulama aynı mutex nesnesi bir ad verilmelidir.

İntra-process iş parçacığı eşitleme için bir mutex kullanılabileceği gibi kullanarak Monitor için özel olarak tasarlanmış monitörler için genellikle tercih edilir.net Framework ve bu nedenle kaynakların daha iyi kullanılmasını sağlamak.Buna karşılık, Mutex sınıfı bir Win32 yapı için bir sarıcı olan.İzleyici'den daha güçlü olmakla birlikte, bir mutex tarafından gerekli olandan daha fazla hesaplama gerektirir pahalı olan birlikte çalışabilirlik geçişleri gerektirir Monitor sınıfı.Bir mutex kullanarak örnek için bkz: Zaman Uyumu Sağlayıcılar.

İnterlocked sınıfı

Yöntemlerini kullanabilirsiniz Interlocked aynı anda güncelleştirmek veya aynı değeri karşılaştırmak birden çok iş parçacığı çalıştığınızda oluşabilecek sorunları önlemek için sınıf.Bu sınıfın yöntemleri güvenle artış sağlar azaltma değişimi ve herhangi bir iş parçacığından değerleri karşılaştırın.

ReaderWriter kilit

Bazı durumlarda, yalnızca veri yazılırsa, kaynak kilitleme ve birden çok istemciye veri değil güncelleştirildiğinde aynı anda veri okumak için izin vermek isteyebilirsiniz.ReaderWriterLock Sınıfı bir iş parçacığı kaynak değiştirme, ancak kaynak okurken özel olmayan erişim sağlayan özel bir kaynağa erişim izni zorlar.ReaderWriter kilitleri neden beklemek için bile, bu iş parçacığı verileri güncelleştirmek gerekmez diğer iş parçacığı özel kilit yararlı bir alternatiftir.

Kilitlenmeler

İş parçacığı eşitleme çok iş parçacıklı uygulamalarda iyileştirmek, ancak her zaman tehlike oluşturma olan bir deadlock, burada birbirine için birden çok iş parçacığı bekleyen ve uygulamayı durdurmak için gelir.Kilitlenme arabaların dört yönlü Dur durdurulur ve her birinin diğeri için gitmek bekleyen bir durum paraleldir.Kilitlenmeler önleme önemlidir; dikkatli planlama anahtarıdır.Kodlama başlamadan önce çok iş parçacıklı uygulamalar oluşturma kilitlenme durumlar genellikle tahmin edebilir.

İlgili Bölümler

Nasıl yapılır: İş Parçacığı Havuzu Kullanma (C# ve Visual Basic)

NASIL yapılır: Visual C# kullanarak bir çoklu kullanım ortamında paylaşılan bir kaynağa erişimi eşitleyin.net

NASIL yapılır: Visual C# kullanarak bir iş parçacığı oluşturun.net

NASIL yapılır: iş parçacığı havuzu iş öğesi, Visual C# kullanarak gönderin.net

NASIL yapılır: Visual C# kullanarak bir çoklu kullanım ortamında paylaşılan bir kaynağa erişimi eşitleyin.net

Ayrıca bkz.

Başvuru

SyncLock Deyimi

lock Deyimi (C# Başvurusu)

Thread

WaitOne

WaitAny

WaitAll

Join

Start

Sleep

Monitor

Mutex

AutoResetEvent

ManualResetEvent

Interlocked

WaitHandle

EventWaitHandle

System.Threading

Set

Kavramlar

Çok İş Parçacıklı Uygulamalar (C# ve Visual Basic)

Zaman Uyumu Sağlayıcılar

Monitörler

Birbirine Kenetlenmiş İşlemler

AutoResetEvent

Çoklu İş Parçacığı Kullanımı için Veri Eşitleme

Diğer Kaynaklar

clr zaman uyumsuz programlama modelini uygulayan

C# ile apm Basitleştirilmiş

kilitlenme Monitörü

Bileşenlerde Çoklu İş Parçacığı Kullanımı

HOW TO: Synchronize Access to a Shared Resource in a Multithreading Environment by Visual C# kullanarak.net