Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, .NET Framework'ün C# ve Visual Basic kodundan Windows Çalışma Zamanı veya Windows Çalışma Zamanı bileşenleri tarafından sağlanan nesnelere yönelik çağrıları işleme yöntemi açıklanır.
.NET Framework'te, özel işleme olmadan varsayılan olarak birden çok iş parçacığından herhangi bir nesneye erişebilirsiniz. Tek ihtiyacınız olan nesneye bir referanstır. Windows Çalışma Zamanı'nda bu tür nesneler çevik olarak adlandırılır. Çoğu Windows Runtime sınıfı çeviktir, ancak bazı sınıflar çevik değildir ve çevik sınıflar bile özel bir işleme gerektirebilir.
Mümkün olduğunca ortak dil çalışma zamanı (CLR), Windows Çalışma Zamanı gibi diğer kaynaklardan gelen nesneleri .NET Framework nesneleriymiş gibi ele alır:
Nesne IAgileObject arabirimini uyguluyorsa veya MarshalingType.Agile ile MarshalingBehaviorAttribute özniteliğine sahipse, CLR bunu çevik olarak ele alır.
CLR, hedef nesnenin iş parçacığı bağlamı için yapıldığı iş parçacığından çağrıyı sıralayabilirse, bunu saydam bir şekilde yapar.
Eğer nesne MarshalingType.Noneile MarshalingBehaviorAttribute özniteliğine sahipse, sınıf hazırlama bilgisi sağlamaz. CLR çağrıyı sıralayamaz, bu nedenle nesnenin yalnızca oluşturulduğu iş parçacığı bağlamında kullanılabileceğini belirten bir iletiyle InvalidCastException özel durumu oluşturur.
Aşağıdaki bölümlerde bu davranışın çeşitli kaynaklardan nesneler üzerindeki etkileri açıklanmaktadır.
C# veya Visual Basic ile yazılmış bir Windows Çalışma Zamanı bileşenindeki nesneler
Bileşendeki etkinleştirilebilen tüm türler varsayılan olarak çevik olur.
Uyarı
Çeviklik, iş parçacığı güvenliği anlamına gelmez. Hem Windows Çalışma Zamanı'nda hem de .NET Framework'te, çoğu sınıf iş parçacığı güvenli değildir. Bunun nedeni, iş parçacığı güvenliğinin bir performans maliyeti getirmesi ve çoğu nesneye hiçbir zaman birden fazla iş parçacığı tarafından erişilmemesidir. Yalnızca gerektiğinde tek tek nesnelere erişimi eşitlemek (veya iş parçacığı güvenli sınıflar kullanmak) daha verimlidir.
Bir Windows Çalışma Zamanı bileşeni yazarken varsayılanı geçersiz kılabilirsiniz. Bkz. ICustomQueryInterface arabirimi ve IAgileObject arabirimi.
Windows Çalışma Zamanı'ndan nesneler
Windows Çalışma Zamanı'ndaki sınıfların çoğu çeviktir ve CLR bunları çevik olarak ele alır. Bu sınıfların belgelerinde sınıf öznitelikleri arasında "MarshalingBehaviorAttribute(Agile)" listelenir. Ancak, XAML denetimleri gibi bu çevik sınıflardan bazılarının üyeleri, kullanıcı arabirimi iş parçacığında çağrılmadıklarında istisna fırlatır. Örneğin, aşağıdaki kod tıklanan düğmenin özelliğini ayarlamak için bir arka plan iş parçacığı kullanmayı dener. Düğmenin content özelliği bir özel durum oluşturur.
private async void Button_Click_2(object sender, RoutedEventArgs e)
{
Button b = (Button) sender;
await Task.Run(() => {
b.Content += ".";
});
}
Private Async Sub Button_Click_2(sender As Object, e As RoutedEventArgs)
Dim b As Button = CType(sender, Button)
Await Task.Run(Sub()
b.Content &= "."
End Sub)
End Sub
Dispatcher özelliğini veya Dispatcher UI iş parçacığı bağlamında var olan herhangi bir nesnenin özelliğini (düğmenin açık olduğu sayfa gibi) kullanarak düğmeye güvenle erişebilirsiniz. Aşağıdaki kod, kullanıcı arabirimi iş parçacığında çağrıyı göndermek için CoreDispatcher nesnesinin RunAsync yöntemini kullanır.
private async void Button_Click_2(object sender, RoutedEventArgs e)
{
Button b = (Button) sender;
await b.Dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal,
() => {
b.Content += ".";
});
}
Private Async Sub Button_Click_2(sender As Object, e As RoutedEventArgs)
Dim b As Button = CType(sender, Button)
Await b.Dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal,
Sub()
b.Content &= "."
End Sub)
End Sub
Uyarı
Dispatcher özelliği, başka bir iş parçacığından çağrıldığında özel durum oluşturmaz.
Ui iş parçacığında oluşturulan bir Windows Çalışma Zamanı nesnesinin ömrü, iş parçacığının ömrüyle sınırlanır. Pencere kapandıktan sonra kullanıcı arabirimi iş parçacığındaki nesnelere erişmeye çalışmayın.
Bir XAML denetimini devralarak veya bir dizi XAML denetimi oluşturarak kendi denetiminizi oluşturursanız, denetiminiz bir .NET Framework nesnesi olduğundan çeviktir. Ancak, kendi temel sınıfının veya bileşen sınıflarının üyelerini çağırırsa veya devralınan üyeleri çağırırsanız, bu üyeler UI iş parçacığı dışında herhangi bir iş parçacığından çağrıldıklarında istisnalar oluşturur.
Serileştirilemeyen sınıflar
Hazırlama bilgileri sağlamayan Windows Çalışma Zamanı sınıfları, MarshalingBehaviorAttribute özniteliğine ve MarshalingType.None'a sahiptir. Böyle bir sınıfın belgelerinde öznitelikleri arasında "MarshalingBehaviorAttribute(None)" listelenir.
Aşağıdaki kod, UI iş parçacığında bir CameraCaptureUI nesnesi oluşturur ve ardından bir iş parçacığı havuzu iş parçacığından nesnenin özelliğini ayarlamaya çalışır. CLR, çağrıyı marşal edemiyor ve oluşturulduğu iş parçacığı bağlamında kullanılabileceğini belirten bir mesajla, System.InvalidCastException istisnası oluşturuyor.
Windows.Media.Capture.CameraCaptureUI ccui;
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
ccui = new Windows.Media.Capture.CameraCaptureUI();
await Task.Run(() => {
ccui.PhotoSettings.AllowCropping = true;
});
}
Private ccui As Windows.Media.Capture.CameraCaptureUI
Private Async Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
ccui = New Windows.Media.Capture.CameraCaptureUI()
Await Task.Run(Sub()
ccui.PhotoSettings.AllowCropping = True
End Sub)
End Sub
CameraCaptureUI belgeleri ayrıca sınıfın öznitelikleri arasında "ThreadingAttribute(STA)" listesini de listeler çünkü kullanıcı arabirimi iş parçacığı gibi tek iş parçacıklı bir bağlamda oluşturulması gerekir.
CameraCaptureUI nesnesine başka bir iş parçacığından erişmek istiyorsanız, kullanıcı arabirimi iş parçacığı için CoreDispatcher nesnesini önbelleğe alabilir ve daha sonra bu iş parçacığında çağrıyı göndermek için kullanabilirsiniz. Veya dağıtıcıyı aşağıdaki kodda gösterildiği gibi sayfa gibi bir XAML nesnesinden alabilirsiniz.
Windows.Media.Capture.CameraCaptureUI ccui;
private async void Button_Click_3(object sender, RoutedEventArgs e)
{
ccui = new Windows.Media.Capture.CameraCaptureUI();
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
() => {
ccui.PhotoSettings.AllowCropping = true;
});
}
Dim ccui As Windows.Media.Capture.CameraCaptureUI
Private Async Sub Button_Click_3(sender As Object, e As RoutedEventArgs)
ccui = New Windows.Media.Capture.CameraCaptureUI()
Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
Sub()
ccui.PhotoSettings.AllowCropping = True
End Sub)
End Sub
C++ dilinde yazılmış bir Windows Çalışma Zamanı bileşenindeki nesneler
Varsayılan olarak, bileşendeki etkinleştirilebilen sınıflar çevik olur. Ancak, C++ iş parçacığı modelleri ve hazırlama davranışı üzerinde önemli miktarda denetim sağlar. Bu makalede daha önce açıklandığı gibi CLR çevik sınıfları tanır, sınıflar çevik olmadığında çağrıları hazırlamaya çalışır ve bir sınıfın hazırlama bilgisi olmadığında System.InvalidCastException özel durumu oluşturur.
UI iş parçacığında çalışan ve ui iş parçacığı dışında bir iş parçacığından çağrıldıklarında özel durumlar oluşturan nesneler için, ui iş parçacığının CoreDispatcher nesnesini kullanarak çağrıyı gönderebilirsiniz.