Windows'ta yönetilen ve yönetilmeyen iş parçacığı oluşturma
Tüm iş parçacıklarının Thread yönetimi, ortak dil çalışma zamanı tarafından oluşturulan iş parçacıkları ve kodu yürütmek üzere yönetilen ortama giren çalışma zamanının dışında oluşturulanlar da dahil olmak üzere sınıfı üzerinden gerçekleştirilir. Çalışma zamanı, yönetilen yürütme ortamında kodu yürüten tüm iş parçacıklarını kendi işleminde izler. Diğer iş parçacıklarını izlemez. İş parçacıkları, yönetilen yürütme ortamına COM birlikte çalışması aracılığıyla girebilir (çalışma zamanı yönetilen nesneleri yönetilmeyen dünyada COM nesneleri olarak kullanıma sağladığından), COM DllGetClassObject işlevi ve platform çağrısı.
Yönetilmeyen bir iş parçacığı çalışma zamanına COM çağrılabilen sarmalayıcı gibi bir şekilde girdiğinde, sistem iç yönetilen Thread bir nesneyi aramak için bu iş parçacığının iş parçacığı yerel depounu denetler. Bir tane bulunursa, çalışma zamanı bu iş parçacığının farkındadır. Ancak bir nesne bulamazsa, çalışma zamanı yeni Thread bir nesne oluşturur ve bu iş parçacığının iş parçacığı yerel deposuna yükler.
Yönetilen iş parçacığında, Thread.GetHashCode kararlı yönetilen iş parçacığı kimliğidir. İş parçacığınızın ömrü boyunca, bu değeri aldığınız uygulama etki alanından bağımsız olarak başka bir iş parçacığının değeriyle çarpışmaz.
Win32 iş parçacığından yönetilen iş parçacığına eşleme
Aşağıdaki tabloda Win32 iş parçacığı öğeleri yaklaşık çalışma zamanı eşdeğerleriyle eşlenmiştir. Bu eşlemenin aynı işlevselliği temsil etmediğini unutmayın. Örneğin, TerminateThread finally yan tümcelerini yürütmez veya kaynakları boşaltmaz ve engellenemez. Ancak, Thread.Abort tüm geri alma kodunuzu yürütür, tüm kaynakları geri alır ve kullanılarak ResetAbortreddedilebilir. İşlevsellik hakkında varsayımlarda bulunmadan önce belgeleri yakından okuduğunuzdan emin olun.
Win32'de | Ortak dil çalışma zamanında |
---|---|
CreateThread | İş Parçacığı ve BirleşimiThreadStart |
TerminateThread | Thread.Abort |
SuspendThread | Thread.Suspend |
ResumeThread | Thread.Resume |
Uyku | Thread.Sleep |
İş parçacığı tanıtıcısında WaitForSingleObject | Thread.Join |
ExitThread | Eşdeğeri yok |
GetCurrentThread | Thread.CurrentThread |
SetThreadPriority | Thread.Priority |
Eşdeğeri yok | Thread.Name |
Eşdeğeri yok | Thread.IsBackground |
CoInitializeEx'e yakın (OLE32.DLL) | Thread.ApartmentState |
Yönetilen iş parçacıkları ve COM daireleri
Yönetilen iş parçacığı, tek iş parçacıklı veya çok iş parçacıklı bir daire barındıracağını belirtmek için işaretlenebilir. (COM iş parçacığı mimarisi hakkında daha fazla bilgi için bkz.İşlemler, İş Parçacıkları ve Daireler.) Sınıfın GetApartmentStateThread , SetApartmentStateve TrySetApartmentState yöntemleri bir iş parçacığının daire durumunu döndürür ve atar. Durum ayarlanmamışsa döndürür GetApartmentStateApartmentState.Unknown.
özelliği yalnızca iş parçacığı durumundayken ayarlanabilir; bir iş parçacığı ThreadState.Unstarted için yalnızca bir kez ayarlanabilir.
İş parçacığı başlatılmadan önce daire durumu ayarlanmamışsa, iş parçacığı çok iş parçacıklı bir daire (MTA) olarak başlatılır. Sonlandırıcı iş parçacığı ve tarafından ThreadPool denetlenen tüm iş parçacıkları MTA'dır.
Önemli
Uygulama başlangıç kodu için, apartman durumunu denetlemenin tek yolu veya STAThreadAttribute öğesini giriş noktası yordamına uygulamaktırMTAThreadAttribute.
COM'a sunulan yönetilen nesneler, serbest iş parçacıklı marshaller'ı toplanmış gibi davranır. Başka bir deyişle, herhangi bir COM dairesinden serbest iş parçacıklı bir şekilde çağrılabilirler. Bu serbest iş parçacıklı davranışı göstermeyen tek yönetilen nesneler, veya StandardOleMarshalObject'den ServicedComponent türetilen nesnelerdir.
Yönetilen dünyada bağlamları ve bağlama bağlı yönetilen örnekleri kullanmadığınız sürece için desteği SynchronizationAttribute yoktur. Enterprise Services kullanıyorsanız nesnenizin öğesinden ServicedComponent türetilmiş olması gerekir (bu, öğesinden ContextBoundObjecttüretilir).
Yönetilen kod COM nesnelerine çağrı yaparken her zaman COM kurallarına uyar. Başka bir deyişle, OLE32 tarafından dikte edilen COM daire proxy'leri ve COM+ 1.0 bağlam sarmalayıcıları aracılığıyla çağrılar.
Engelleyici sorunlar
İş parçacığı yönetilmeyen kodda iş parçacığını engelleyen işletim sistemine yönetilmeyen bir çağrı yaparsa, çalışma zamanı veya Thread.Abortiçin Thread.Interrupt bunun denetimini almaz. durumundaThread.Abort, çalışma zamanı iş parçacığını Abort olarak işaretler ve yönetilen kodu yeniden girdiğinde bunun denetimini alır. Yönetilmeyen engelleme yerine yönetilen engellemeyi kullanmanız tercih edilir. WaitHandle.WaitOne,WaitHandle.WaitAny, WaitHandle.WaitAll, Monitor.Enter, Monitor.TryEnter, , Thread.Join, GC.WaitForPendingFinalizersvb. tümü ve için Thread.InterruptThread.Abortyanıt verir. Ayrıca, iş parçacığınız tek iş parçacıklı bir dairedeyse, tüm bu yönetilen engelleme işlemleri, iş parçacığınız engellenirken dairenize iletileri doğru bir şekilde pompalar.
İş parçacıkları ve lifler
.NET iş parçacığı modeli fiberleri desteklemez. Fiberler kullanılarak uygulanan yönetilmeyen hiçbir işleve çağrılmamalıdır. Bu tür çağrılar .NET çalışma zamanının kilitlenmesine neden olabilir.