Arka plan görevini kaydetme

Önemli API'ler

Arka plan görevlerinin çoğunu güvenli bir şekilde kaydetmek için yeniden kullanılabilecek bir işlev oluşturmayı öğrenin.

Bu konu hem işlem içi arka plan görevleri hem de işlem dışı arka plan görevleri için geçerlidir. Bu konu başlığında, zaten kaydedilmesi gereken bir arka plan göreviniz olduğu varsayılır. (Bkz. İşlem dışı çalışan bir arka plan görevi oluşturma ve kaydetme veya İşlem içi bir arka plan görevi oluşturma ve kaydetme hakkında bilgi için arka plan görevi yazma.)

Bu konu, arka plan görevlerini kaydeden bir yardımcı program işlevini açıklar. Bu yardımcı program işlevi, birden çok kayıtla ilgili sorunları önlemek için görevi birden çok kez kaydetmeden önce var olan kayıtları denetler ve arka plan görevine bir sistem koşulu uygulayabilir. İzlenecek yol, bu yardımcı program işlevinin eksiksiz ve çalışan bir örneğini içerir.

Not  

Evrensel Windows uygulamaları, arka plan tetikleyici türlerinden herhangi birini kaydetmeden önce RequestAccessAsync çağırmalıdır.

Bir güncelleştirmeyi yayınladıktan sonra Evrensel Windows uygulamanızın düzgün çalışmaya devam etmesini sağlamak için, RemoveAccess'nı çağırmanız ve ardından uygulamanız güncelleştirildikten sonra başlatıldığında requestAccessAsync çağırmanız gerekir. Daha fazla bilgi için bkz. Arka plan görevleri için yönergeler.

Yöntem imzasını ve dönüş türünü tanımlama

Bu yöntem, görev giriş noktası, görev adı, daha önce oluşturulmuş bir arka plan görev tetikleyicisi ve (isteğe bağlı olarak) arka plan görevi için SystemCondition kullanır. Bu yöntem bir BackgroundTaskRegistration nesnesi döndürür.

Önemli

taskEntryPoint - işlem dışı çalışan arka plan görevleri için, bu ad alanı adı, '.' ve arka plan sınıfınızı içeren sınıfın adı olarak oluşturulmalıdır. Dize küçük-büyük harf farkına duyarlıdır. Örneğin, "MyBackgroundTasks" ad alanınız ve arka plan sınıf kodunuzu içeren "BackgroundTask1" sınıfınız varsa, taskEntryPoint dizesi "MyBackgroundTasks.BackgroundTask1" olur. Arka plan göreviniz uygulamanızla aynı işlemde çalışıyorsa (işlem içi arka plan görevi) taskEntryPoint ayarlanmamalıdır.

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    
    // We'll add code to this function in subsequent steps.

}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{
    
    // We'll add code to this function in subsequent steps.

}

Mevcut kayıtları denetleme

Görevin zaten kayıtlı olup olmadığını denetleyin. Bir görev birden çok kez kaydedildiğinde tetiklendiğinde birden çok kez çalıştırılacağından bunu denetlemek önemlidir; bu işlem fazla CPU kullanabilir ve beklenmeyen davranışlara neden olabilir.

BackgroundTaskRegistration.AllTasks özelliğini sorgulayıp sonucu yineleyerek var olan kayıtları deleyebilirsiniz. Her örneğin adını denetleyin; kaydettiğiniz görevin adıyla eşleşiyorsa döngüden çıkın ve kodunuzun sonraki adımda farklı bir yol seçebilmesi için bir bayrak değişkeni ayarlayın.

Not Uygulamanıza özgü arka plan görev adlarını kullanın. Her arka plan görevinin benzersiz bir ada sahip olduğundan emin olun.

Aşağıdaki kod, son adımda oluşturduğumuz SystemTrigger kullanarak bir arka plan görevi kaydeder:

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == name)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }
    
    // We'll register the task in the next step.
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{
    //
    // Check for existing registrations of this background task.
    //
    
    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;
    
    while (hascur)
    {
        auto cur = iter->Current->Value;
        
        if(cur->Name == name)
        {
            //
            // The task is registered.
            //
            
            return (BackgroundTaskRegistration ^)(cur);
        }
        
        hascur = iter->MoveNext();
    }
    
    // We'll register the task in the next step.
}

Arka plan görevini kaydetme (veya var olan kaydı döndürme)

Görevin var olan arka plan görev kayıtları listesinde bulunup bulunmadığını denetleyin. Öyleyse, görevin bu örneğini döndürün.

Ardından, yeni bir BackgroundTaskBuilder nesnesi kullanarak görevi kaydedin. Bu kod koşul parametresinin null olup olmadığını denetlemeli ve değilse koşulu kayıt nesnesine eklemelidir. BackgroundTaskBuilder.Register yöntemi tarafından döndürülen BackgroundTaskRegistration'ü döndürün.

Arka plan görev kayıt parametreleri kayıt sırasında doğrulanır. Kayıt parametrelerinden herhangi biri geçersizse bir hata döndürülür. Uygulamanızın arka plan görevi kaydı başarısız olduğunda bu senaryoları doğru bir şekilde işlediğinden emin olun. Aksi takdirde, uygulamanız bir görevi kaydetmeye çalışırken geçerli bir kayıt nesnesine bağlıysa, çökebilir. Not Uygulamanızla aynı işlemde çalışan bir arka plan görevi kaydediyorsanız, String.Empty parametresi için null veya taskEntryPoint gönderin.

Aşağıdaki örnek var olan görevi döndürür veya arka plan görevini kaydeden kod ekler (varsa isteğe bağlı sistem koşulu dahil):

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == taskName)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }

    //
    // Register the background task.
    //

    var builder = new BackgroundTaskBuilder();

    builder.Name = name;

    // in-process background tasks don't set TaskEntryPoint
    if ( taskEntryPoint != null && taskEntryPoint != String.Empty)
    {
        builder.TaskEntryPoint = taskEntryPoint;
    }
    builder.SetTrigger(trigger);

    if (condition != null)
    {
        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task = builder.Register();

    return task;
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{

    //
    // Check for existing registrations of this background task.
    //

    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;

    while (hascur)
    {
        auto cur = iter->Current->Value;

        if(cur->Name == name)
        {
            //
            // The task is registered.
            //

            return (BackgroundTaskRegistration ^)(cur);
        }

        hascur = iter->MoveNext();
    }

    //
    // Register the background task.
    //

    auto builder = ref new BackgroundTaskBuilder();

    builder->Name = name;
    builder->TaskEntryPoint = taskEntryPoint;
    builder->SetTrigger(trigger);

    if (condition != nullptr) {
        
        builder->AddCondition(condition);
    }

    BackgroundTaskRegistration ^ task = builder->Register();

    return task;
}

Tam arka plan görevi kayıt hizmet fonksiyonu

Bu örnekte, tamamlanmış arka plan görevi kayıt işlevi gösterilmektedir. Bu işlev, ağ arka plan görevleri dışında çoğu arka plan görevini kaydetmek için kullanılabilir.

//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint,
                                                                string taskName,
                                                                IBackgroundTrigger trigger,
                                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == taskName)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }

    //
    // Register the background task.
    //

    var builder = new BackgroundTaskBuilder();

    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    builder.SetTrigger(trigger);

    if (condition != null)
    {

        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task = builder.Register();

    return task;
}
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(Platform::String ^ taskEntryPoint,
                                                             Platform::String ^ taskName,
                                                             IBackgroundTrigger ^ trigger,
                                                             IBackgroundCondition ^ condition)
{

    //
    // Check for existing registrations of this background task.
    //

    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;

    while (hascur)
    {
        auto cur = iter->Current->Value;

        if(cur->Name == name)
        {
            //
            // The task is registered.
            //

            return (BackgroundTaskRegistration ^)(cur);
        }

        hascur = iter->MoveNext();
    }


    //
    // Register the background task.
    //

    auto builder = ref new BackgroundTaskBuilder();

    builder->Name = name;
    builder->TaskEntryPoint = taskEntryPoint;
    builder->SetTrigger(trigger);

    if (condition != nullptr) {

        builder->AddCondition(condition);
    }

    BackgroundTaskRegistration ^ task = builder->Register();

    return task;
}