2008-10-03 17 views
97

çoklu kullanım: STAThread ve STAThread MSDN makalesinde itibaren

bir uygulama için COM iş parçacığı modeli tek iş parçacıklı grup (STA) olduğunu gösterir.

(Referans için, bu the entire article bu.)

geçip üstümle Tek parçacıklı ... tamam. Ayrıca, uygulamanız COM birlikte kullanılmadığı sürece, bu öznitelik aslında hiçbir şey yapmaz. Peki tam olarak ne yapıyor ve çok iş parçacıklı uygulamaları nasıl etkiler? Çoklu iş parçacıklı uygulamalar (yalnızca threadpools ve benzeri değil) asenkron yöntem çağrıları kullanan Timer s kullanan herhangi bir şeyi içerenler varsa, 'güvenli olmak için' olsa bile, MTAThread'i kullanmalı mıdır? STAThread ve MTAThread aslında ne yapar?

cevap

58

Apartman iş parçacığı bir COM kavramdır; COM kullanmıyorsanız ve aradığınız API'lardan hiçbiri COM "kapakların altında" kullanılmazsa, daireler hakkında endişelenmenize gerek yoktur.

Dairelerin farkında olmanız gerekiyorsa, detaylar a little complicated; muhtemelen aşırı basitleştirilmiş bir sürüm, STA olarak etiketlenen COM nesnelerinin bir STAThread üzerinde çalıştırılması ve MTA olarak işaretlenmiş COM nesnelerinin bir MTA iş parçacığında çalıştırılması gerektiğidir. COM, bu kuralları kullanarak, bu farklı nesneler arasındaki çağrıları en iyi duruma getirerek, gerekli olmayan yerlerde marşlamayı önleyebilir.

+7

Bu çok basitleştirilmiş. Çok iş parçacıklı nesneler herhangi bir iş parçacığında çalışabilir. Daire dişli nesneler, yalnızca oluşturuldukları dairede çalışabilirler. –

+27

Bir STA iş parçacığında bir MTA nesnesinden bir MTA nesnesine yapılan bir çağrı, MTA iş parçacığına (MTA nesnesi, serbest parçacıklı işleyiciyi uygulamadığı sürece) sabitlenir. . Dediğim gibi, detaylar karmaşıklaşabilir. (COM takımında birkaç yıl çalıştım * grin *) – Bruce

+9

Bazen doğrudan COM kullanmıyor olsanız bile bunun farkında olmanız gerekir. Bir iş parçacığı, herhangi bir grafik penceresi görüntülüyorsa Tek Yivli Daire modelini kullanmalıdır. Bu nedenle, Windows form uygulamasında [STAThread], her zaman ana yöntemin üstünde görüntülenir. –

3

Bu, parametre olarak COINIT_APARTMENTTHREADED değerini belirtmek için CoInitialize'un çağrılmasını sağlar. Herhangi bir COM bileşeni veya ActiveX denetimi kullanmıyorsanız, hiç bir etkisi olmayacaktır. Eğer yaparsan o zaman çok önemli. Onlara yapılan daire dişli dişli etkili bir bekar olan

Kontroller, aramalar sadece onlar oluşturulan bu dairede işlenebilir

Biraz daha detay MSDN'den. oluşturulmuş

Nesneleri tek iş parçacıklı (STA) yöntemi, sadece kendi dairenin parçacığından çağırır böylece çağrıları seri hale getirilmiş ve (mesaj-kuyruk sınırlarında zaman Win32 işlevi PeekMessage veyasadece gelmesi almakSendMessage çağrılır). Bir çoklu işlemli (MTA) bir COM iş parçacığı üzerinde oluşturulan

Nesneler yöntemini alabilen her an diğer iş parçacığı çağrıları olmalıdır. Sen tipik nesnenin verilerin korunmasına yardımcı olur gibi kritik bölümler, semaforları veya muteksleri Win32 senkronizasyon ilkellerini kullanarak bir çok iş parçacıklı nesnenin kodunda eşzamanlılık kontrolü çeşit uygulamaya koyacak. Nötr dişli daire (NTA) içinde çalıştırmak için yapılandırılmış bir amacı bir STA veya MTA ya olan bir parçacığı tarafından verilir

, NTA bu iplik aktarır. Bu iş parçacığı daha sonra CoInitializeEx çağırırsa, çağrısı başarısız olur ve RPC_E_CHANGED_MODE değerini döndürür.

+0

MSDN makalesi bir COM açısından yararlıdır, ancak .NET "STAThread" özniteliğine/"ApartmentState" cevaben "CoInitialize()" yi çağırdığında bana söyleyebilir misiniz? Not: MSDN'deki makale şuradadır: [CoInitializeEx işlevi] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms695279%28v=vs.85%29.aspx). – jrh

+0

İş parçacığı başlatıldığında onu çağırır. –

+0

[iş parçacığı> SetApartment] (https://github.com/dotnet/coreclr/blob/master/src/vm/comsynchronizable.cpp#L987) 'CoInitialize kullanır) dahili olarak? Ben orada STAThread Özniteliği tam olarak izledim ama iz soğuk gitti ('Thread :: SetApartment' için kaynak bulamıyorum). Thread sınıfı, thread.h dosyasından (COM thread.h) herhangi bir yerde belgelendi mi? MFC, ATL mi yoksa başka bir şey mi? – jrh

-14

DURUM, bir C# GUI Projesinin Ana işlevinden önce yazılmıştır. Hiçbir şey yapmaz ancak programın tek bir iş parçacığı oluşturmasına izin verir.