Control.InvokeRequired Özellik
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Çağıran, denetimin oluşturulduğu iş parçacığından farklı bir iş parçacığında olduğundan, çağıranın denetime yöntem çağrıları yaparken çağırma yöntemini çağırması gerekip gerekmediğini belirten bir değer alır.
public:
property bool InvokeRequired { bool get(); };
[System.ComponentModel.Browsable(false)]
public bool InvokeRequired { get; }
[<System.ComponentModel.Browsable(false)>]
member this.InvokeRequired : bool
Public ReadOnly Property InvokeRequired As Boolean
Özellik Değeri
true
denetimi Handle çağıran iş parçacığından farklı bir iş parçacığında oluşturulduysa (bir çağırma yöntemi aracılığıyla denetime çağrı yapmanız gerektiğini belirtir); aksi takdirde, false
.
Uygulamalar
- Öznitelikler
Açıklamalar
Windows Forms denetimler belirli bir iş parçacığına bağlıdır ve iş parçacığı güvenli değildir. Bu nedenle, bir denetimin yöntemini farklı bir iş parçacığından çağırıyorsanız, çağrıyı uygun iş parçacığına sıralamak için denetimin çağırma yöntemlerinden birini kullanmanız gerekir. Bu özellik, bir çağrı yöntemi çağırmanız gerekip gerekmediğini belirlemek için kullanılabilir. Bu yöntem, hangi iş parçacığının bir denetime sahip olduğunu bilmiyorsanız yararlı olabilir.
Not
özelliğine InvokeRequired ek olarak, bir denetimde iş parçacığının çağrılmaya güvenli olduğu dört yöntem vardır: EndInvokeInvokeBeginInvokeve CreateGraphics denetimin tanıtıcısı zaten oluşturulmuşsa. Denetimin tanıtıcısı bir arka plan iş parçacığında oluşturulmadan önce çağrılması CreateGraphics , geçersiz iş parçacığı çağrılarına neden olabilir. Diğer tüm yöntem çağrıları için, farklı bir iş parçacığından çağrı yaparken bu çağırma yöntemlerinden birini kullanmanız gerekir.
Denetimin tanıtıcısı henüz yoksa, InvokeRequired pencere tutamacına sahip bir denetim veya form bulana kadar denetimin üst zincirinde arama yapar. Uygun tanıtıcı bulunamazsa yöntemi InvokeRequired döndürür false
.
Bu, InvokeRequired gerekli değilse (çağrı aynı iş parçacığında gerçekleşir) veya denetim farklı bir iş parçacığında oluşturulduysa ancak denetimin tanıtıcısı henüz oluşturulmadıysa döndürebileceği false
Invoke anlamına gelir.
Denetimin tanıtıcısının henüz oluşturulmamış olması durumunda, yalnızca denetimdeki özellikleri, yöntemleri veya olayları çağırmamalısınız. Bu, denetimin tanıtıcısının arka plan iş parçacığında oluşturulmasına, denetimi ileti pompası olmadan bir iş parçacığında yalıtmasına ve uygulamanın kararsız olmasına neden olabilir.
Arka plan iş parçacığında döndürdüğünde InvokeRequiredfalse
değerini IsHandleCreated de denetleyerek bu duruma karşı koruma sağlayabilirsiniz. Denetim tutamacı henüz oluşturulmadıysa, veya BeginInvokeçağrısından Invoke önce oluşturulana kadar beklemeniz gerekir. Genellikle, bu durum yalnızca uygulama için birincil formun oluşturucusunda bir arka plan iş parçacığı oluşturulduğunda (form gösterilmeden veya Application.Run
çağrılmadan önce içinde Application.Run(new MainForm())
olduğu gibi) oluşur.
Bir çözüm, arka plan iş parçacığını başlatmadan önce formun tanıtıcısının oluşturulmasını beklemektir. özelliğini çağırarak Handle oluşturma işlemini zorla veya arka plan işlemini başlatmak için olaya kadar Load bekleyin.
Daha da iyi bir çözüm, iş parçacıkları arası sıralama denetimi yerine tarafından SynchronizationContext döndürülen öğesini kullanmaktırSynchronizationContext
.
Not
İletiyi işlemesi gereken iş parçacığı artık etkin değilse bir özel durum oluşturulabilir.
Çok iş parçacıklı Windows Forms denetimleri hakkında daha fazla bilgi için bkz. Nasıl yapılır: Dosyaları Aramak için Arka Plan İş Parçacığı Kullanma ve Nasıl yapılır: Windows Forms Denetimlere Thread-Safe Çağrıları Yapma.