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 konuda, çok örnekli Evrensel Windows Platformu (UWP) uygulamalarının nasıl oluşturulacağı açıklanmaktadır.
Windows 10, sürüm 1803'ten (10.0; Derleme 17134) ile birlikte UWP uygulamanız birden çok örneği desteklemeyi kabul edebilir. Çok örnekli bir UWP uygulamasının örneği çalışıyorsa ve sonraki bir etkinleştirme isteği geliyorsa platform mevcut örneği etkinleştirmez. Bunun yerine, ayrı bir işlemde çalışan yeni bir örnek oluşturur.
Çok örnekli davranışı kabul et
Yeni bir çok örnekli uygulama oluşturuyorsanız, Visual Studio Market'ndan sağlanan Çok Örnekli Uygulama Projesi Şablonları.VSIXyükleyebilirsiniz. Şablonları yükledikten sonra, Yeni Proje iletişim kutusunda, Visual C# > Windows Evrensel (veya Diğer Diller > Visual C++ > Windows Evrensel) altında kullanılabilir olacaklardır.
Uyarı
Çok Örnekli Uygulama Projesi şablonu artık kullanılamıyor. VSIX şablonu kolaylık olduğundan, bunun yerine mevcut projeyi aşağıda açıklandığı gibi değiştirmeniz gerekir. DISABLE_XAML_GENERATED_MAIN sabitini proje derleme simgelerine eklediğinizden emin olun. Bu, derlemenin varsayılan Main() oluşturmasını engeller. Bu, main() uygulamasının özel olarak yazılmış bir sürümünün kullanılmasına olanak tanır.
İki şablon yüklenir: Çok Örnekli UWP uygulaması, çok örnekli uygulama oluşturmak için şablon sağlar ve yeni bir örneği başlatmak veya zaten başlatılmış bir örneği seçmeli olarak etkinleştirmek için üzerinde oluşturabileceğiniz ek mantık sağlayan Çok Örnekli Yeniden Yönlendirme UWP uygulaması. Örneğin, aynı belgeyi aynı anda yalnızca bir örneğin düzenlemesini istediğinizden, yeni bir örnek başlatmak yerine bu dosyanın açık olduğu örneği ön plana getirirsiniz.
Her iki şablon da SupportsMultipleInstances dosyasına package.appxmanifest ekler. Ad alanı ön ekini desktop4not edin: Yalnızca masaüstünü hedefleyen projeler çoklu depolamayı destekler.
Uyarı
Uygulamanız Windows 10, sürüm 2004 (Derleme 19041) veya üzerini hedefliyorsa, desktop4:SupportsMultipleInstances yerine uap10:SupportsMultipleInstances daha yeni özniteliğini kullanabilirsiniz.
uap10 ad alanı, yeni uygulamalar için tercih edilen yöntemdir.
<Package
...
xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
IgnorableNamespaces="uap mp desktop4">
...
<Applications>
<Application Id="App"
...
desktop4:SupportsMultipleInstances="true">
...
</Application>
</Applications>
...
</Package>
Çok örnekli etkinleştirme yeniden yönlendirmesi
UWP uygulamaları için çoklu başlangıç desteği, uygulamanın birden çok örneğini başlatmayı mümkün kılmanın ötesine geçer. Uygulamanızın yeni bir örneğinin başlatılıp başlatılmayacağını veya zaten çalışmakta olan bir örneğin etkinleştirilip etkinleştirilmediğini seçmek istediğiniz durumlarda özelleştirmeye olanak tanır. Örneğin, uygulama başka bir örnekte zaten düzenlenmekte olan bir dosyayı düzenlemek için başlatılırsa, zaten dosyayı düzenlemekte olan başka bir örneği açmak yerine etkinleştirmeyi bu örneğe yönlendirmek isteyebilirsiniz.
Bunu uygulamada görmek için Çok örnekli UWP uygulamaları oluşturma hakkındaki bu videoyu izleyin.
Çok Örnekli Yeniden Yönlendirme UWP uygulaması şablonu, yukarıda gösterildiği gibi package.appxmanifest dosyasına SupportsMultipleInstances ekler ve ayrıca projenize işlevi içeren bir Program.cs (veya şablonun C++ sürümünü kullanıyorsanız Main()) ekler. Etkinleştirmeyi yeniden yönlendirme mantığı Main işlevine gider.
Program.cs şablonu aşağıda gösterilmiştir.
AppInstance.RecommendedInstance özelliği, varsa (veya yoksa null) bu etkinleştirme isteği için kabuk tarafından sağlanan tercih edilen örneği temsil eder. Kabuk bir tercih sağlıyorsa etkinleştirmeyi bu örneğe yeniden yönlendirebilir ya da isterseniz görmezden gelebilirsiniz.
public static class Program
{
// This example code shows how you could implement the required Main method to
// support multi-instance redirection. The minimum requirement is to call
// Application.Start with a new App object. Beyond that, you may delete the
// rest of the example code and replace it with your custom code if you wish.
static void Main(string[] args)
{
// First, we'll get our activation event args, which are typically richer
// than the incoming command-line args. We can use these in our app-defined
// logic for generating the key for this instance.
IActivatedEventArgs activatedArgs = AppInstance.GetActivatedEventArgs();
// If the Windows shell indicates a recommended instance, then
// the app can choose to redirect this activation to that instance instead.
if (AppInstance.RecommendedInstance != null)
{
AppInstance.RecommendedInstance.RedirectActivationTo();
}
else
{
// Define a key for this instance, based on some app-specific logic.
// If the key is always unique, then the app will never redirect.
// If the key is always non-unique, then the app will always redirect
// to the first instance. In practice, the app should produce a key
// that is sometimes unique and sometimes not, depending on its own needs.
string key = Guid.NewGuid().ToString(); // always unique.
//string key = "Some-App-Defined-Key"; // never unique.
var instance = AppInstance.FindOrRegisterInstanceForKey(key);
if (instance.IsCurrentInstance)
{
// If we successfully registered this instance, we can now just
// go ahead and do normal XAML initialization.
global::Windows.UI.Xaml.Application.Start((p) => new App());
}
else
{
// Some other instance has registered for this key, so we'll
// redirect this activation to that instance instead.
instance.RedirectActivationTo();
}
}
}
}
Main(), ilk olarak çalışan şeydir.
Yukarıdaki kod, uygulamanızın mevcut veya yeni bir örneğinin etkinleştirilip etkinleştirilmediğini belirler. Etkinleştirmek istediğiniz mevcut bir örnek olup olmadığını belirlemek için bir anahtar kullanılır. Örneğin, uygulamanız dosya etkinleştirmesiiçin başlatılabiliyorsa, dosya adını bir anahtar olarak kullanabilirsiniz. Ardından uygulamanızın bir örneğinin zaten bu anahtara kayıtlı olup olmadığını denetleyebilirsiniz ve yeni bir örnek açmak yerine bu örneği etkinleştirebilirsiniz. Kodun arkasındaki fikir budur: var instance = AppInstance.FindOrRegisterInstanceForKey(key);
Anahtara kayıtlı bir örnek bulunursa bu örnek etkinleştirilir. Anahtar bulunamazsa, geçerli örnek (şu anda Mainçalıştıran örnek) uygulama nesnesini oluşturur ve çalışmaya başlar.
Arka plan görevleri ve çoklu başlangıç
- İşlem dışı arka plan görevleri, çoklu örneklemeyi destekler. Genellikle, her yeni tetikleyici arka plan görevinin yeni bir örneğine neden olur (teknik olarak birden çok arka plan görevi aynı konak işleminde çalıştırılabilir). Bununla birlikte, arka plan görevinin farklı bir örneği oluşturulur.
- İn-proc arka plan görevleri, çoklu instance desteği sağlamaz.
- Arka plan ses görevleri çoklu başlatmayı desteklemez.
- Bir uygulama bir arka plan görevini kaydettiğinde, genellikle görevin zaten kayıtlı olup olmadığını denetler ve ardından görevi silip yeniden kaydeder veya var olan kaydı korumak için hiçbir şey yapmaz. Bu, yine de çok örnekli uygulamalarda tipik bir davranıştır. Bununla birlikte, çoklu örnekleme yapan bir uygulama, her bir örnek için farklı bir arka plan görev adı kaydetmeyi seçebilir. Bu, aynı tetikleyici için birden çok kayıt yapılmasına neden olur ve tetikleyici tetiklendiğinde birden çok arka plan görev örneği etkinleştirilir.
- Uygulama hizmetleri, her bağlantı için app-service arka plan görevinin ayrı bir örneğini başlatır. Bu, çok örnekli uygulamalar için değişmeden kalır; yani çok örnekli bir uygulamanın her örneği, app-service arka plan görevinin kendi örneğini alır.
Dikkat edilmesi gereken ek noktalar
- Çoklu örnekleme, masaüstü projelerini hedefleyen UWP uygulamaları tarafından desteklenir.
- Yarış koşulları ve çekişme sorunlarını önlemek için, çok örnekli uygulamaların birden çok örnek arasında paylaşılabilen ayarlara, uygulama yerel depolama alanına ve diğer kaynaklara (kullanıcı dosyaları, veri deposu vb.) erişimi bölümleme/eşitleme adımları gerçekleştirmesi gerekir. Mutexes, semaforlar, olaylar vb. gibi standart eşitleme mekanizmaları kullanılabilir.
- Uygulamanın Package.appxmanifest dosyasında
SupportsMultipleInstancesvarsa, uzantılarınınSupportsMultipleInstancesbildirmesi gerekmez. - Arka plan görevleri veya uygulama hizmetleri dışında başka bir uzantıya
SupportsMultipleInstanceseklerseniz ve uzantıyı barındıran uygulama package.appxmanifest dosyasında daSupportsMultipleInstancesbildirmezse, şema hatası oluşturulur. - Uygulamalar, bildirimlerindeki ResourceGroup bildirimini kullanarak birden çok arka plan görevini aynı konakta gruplandırabilir. Bu, her aktifleşmenin ayrı bir ana bilgisayara gittiği çoklu örnekleme ile çakışıyor. Bu nedenle bir uygulama kendi bildiriminde hem
SupportsMultipleInstanceshem deResourceGroupbildiremez.
Örnek
Çoklu örnek aktivasyon yönlendirmesi örneği için Çoklu Örnek örneği'e bakın.
Ayrıca bakınız
AppInstance.FindOrRegisterInstanceForKeyAppInstance.GetActivatedEventArgsAppInstance.RedirectActivationToUygulama etkinleştirmeyi işleme