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.
Uyarı
Bu makalede, paket kimliğine sahip uygulamalar için, UWP ve paketlenmiş masaüstü uygulamaları dahil olmak üzere, Windows.ApplicationModel.Background ad alanında Windows Çalışma Zamanı (WinRT) BackgroundTaskBuilder API'si ile oluşturulan arka plan görevleri ele alınmaktadır. Yeni bir uygulama oluşturuyor veya mevcut bir uygulamayı Windows Uygulama SDK'sı geçiriyorsanız bkz. Windows uygulamalarında arka plan görevlerini kullanma ve Background görev geçiş stratejisi.
Windows Çalışma Zamanı (WinRT) BackgroundTaskBuilder sınıfıyla uygulamanızda bir arka plan görevi oluşturmayı ve kaydetmeyi öğrenin.
Arka plan görevini kaydetme
Evrensel Windows Platformu (UWP) bir uygulamaya arka plan görevi kaydetmenin tam örneği için BackgroundTask örneğine bakın.
Aşağıdaki örnekte, yinelenen 15 dakikalık zamanlayıcıda çalışan bir Win32 COM görevinin kaydı gösterilmektedir.
Bir arka plan görevini kaydetmek için önce BackgroundTaskBuilder sınıfının yeni bir örneğini oluşturmanız gerekir.
BackgroundTaskBuilder sınıfı, uygulamanızda arka plan görevleri oluşturmak ve kaydetmek için kullanılır. Aşağıdaki kod örneğinde sınıfının yeni bir örneğinin nasıl oluşturulacağı gösterilmektedir BackgroundTaskBuilder :
using System;
using Windows.ApplicationModel.Background;
public IBackgroundTaskRegistration RegisterBackgroundTaskWithSystem(IBackgroundTrigger trigger, Guid entryPointClsid, string taskName)
{
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
builder.SetTrigger(trigger);
builder.SetTaskEntryPointClsid(entryPointClsid);
BackgroundTaskRegistration registration;
if (builder.Validate())
{
registration = builder.Register(taskName);
}
else
{
registration = null;
}
return registration;
}
RegisterBackgroundTaskWithSystem(new TimeTrigger(15, false), typeof(TimeTriggeredTask).GUID, typeof(TimeTriggeredTask).Name);
RegisterBackgroundTaskWithSystem yöntemi üç parametre alır:
-
trigger: Arka plan görevini başlatacak tetikleyici. -
entryPointClsid: Arka plan görev giriş noktasının sınıf kimliği. -
taskName: Arka plan görevinin adı.
RegisterBackgroundTaskWithSystem yöntemi, BackgroundTaskBuilder sınıfının yeni bir örneğini oluşturur ve arka plan görevi için tetikleyici ve giriş noktası sınıf kimliğini ayarlar. Yöntemi daha sonra arka plan görevini sisteme kaydeder.
Uyarı
Bu sınıf uyarlanabilir değildir, yani iş parçacığı modelini ve dağıtım davranışını dikkate almanız gerekir. Daha fazla bilgi edinmek için bakınız Threading and Marshaling (C++/CX) ve Çok iş parçacıklı bir ortamda Windows Çalışma Zamanı nesneleri kullanma (.NET).
Arka plan görevinde modern beklemeyi işleme
BackgroundTaskBuilder ve ilgili API'ler paketlenmiş masaüstü uygulamalarının arka plan görevlerini çalıştırmasına zaten izin verir. API artık bu API'leri genişleterek bu uygulamaların kodu modern beklemede yürütmesini sağlar. Güncelleştirme ayrıca, sistemin pil ömrünü korumak için modern bekleme modundaki uygulamanın arka plan görevlerini kısıtlayacak olup olmadığını belirlemek için uygulama tarafından sorgulanabilecek özellikler de ekler. Bu, uygulamaların VoIP çağrıları veya modern bekleme modundan gelen diğer anında iletme bildirimlerini alabilmesi gibi senaryoları etkinleştirir.
Uyarı
Bu bölümdeki "Paketlenmiş masaüstü uygulamaları", paket kimliğine (Masaüstü Köprüsü veya Seyrek İmzalı Paketlenmiş uygulamalar) sahip olan ve giriş noktası olarak ana (veya wmain) işlevine sahip Win32 uygulamalarını ifade eder.
Aşağıdaki örnek, bir uygulama geliştiricisinin belirtilen görev adına sahip en fazla bir göreve kaydolmak için BackgroundTaskBuilder API'sini nasıl kullanabileceğini gösterir. Örnek ayrıca, uygulamanın en kritik görevleri için modern beklemede çalışması amacıyla görev kaydını denetlemeyi ve bu kayda katılmayı nasıl seçebileceğinizi gösterir.
// The following namespace is required for BackgroundTaskBuilder APIs.
using Windows.ApplicationModel.Background;
// The following namespace is required for API version checks.
using Windows.Foundation.Metadata;
// The following namespace is used for showing Toast Notifications. This
// namespace requires the Microsoft.Toolkit.Uwp.Notifications NuGet package
// version 7.0 or greater.
using Microsoft.Toolkit.Uwp.Notifications;
// Incoming calls are considered to be critical tasks to the operation of the app.
const string IncomingCallTaskName = "IncomingCallTask";
const string NotificationTaskName = "NotificationTask";
const string PrefetchTaskName = "PrefetchTask";
public static bool IsAllowedInBackground(BackgroundAccessStatus status) {
return ((status != BackgroundAccessStatus.Denied) &&
(status != BackgroundAccessStatus.DeniedBySystemPolicy) &&
(status != BackgroundAccessStatus.DeniedByUser) &&
(status != BackgroundAccessStatus.Unspecified));
}
public async void RegisterTask(IBackgroundTrigger trigger,
Guid entryPointClsid,
string taskName,
bool isRunInStandbyRequested)
{
var taskBuilder = new BackgroundTaskBuilder();
taskBuilder.SetTrigger(trigger);
taskBuilder.SetTaskEntryPointClsid(entryPointClsid);
// Only the most critical background work should be allowed to proceed in
// modern standby. Additionally, some platforms may not support modern
// or running background tasks in modern standby at all. Only attempt to
// request modern standby execution if both are true. Requesting network
// is necessary when running in modern standby to handle push notifications.
if (IsRunInStandbyRequested && taskBuilder.IsRunningTaskInStandbySupported)
{
var accessStatus = BackgroundExecutionManager.GetAccessStatusForModernStandby();
if (!IsAllowedInBackground(accessStatus)
{
await BackgroundExecutionManager.RequestAccessKindForModernStandby(
BackgroundAccessRequestKind.AllowedSubjectToSystemPolicy,
"This app wants to receive incoming notifications while your device is asleep");
}
accessStatus = BackgroundExecutionManager.GetAccessStatusForModernStandby();
if (IsAllowedInBackground(accessStatus)
{
taskBuilder.IsRunningTaskInStandbyRequested = true;
taskBuilder.IsNetworkRequested = true;
}
}
// Check that the registration is valid before attempting to register.
if (taskBuilder.IsRegistrationValid)
{
// If a task with the specified name already exists, it is unregistered
// before a new one is registered. Note this API may still fail from
// catastrophic failure (e.g., memory allocation failure).
taskBuilder.Register(taskName);
}
return;
}
RegisterTask(new PushNotificationTrigger(), "{INSERT-YOUR-GUID-HERE}", IncomingCallTaskName, true);
Modern bekleme modunda arka plan görevlerinin bütçesini aşıp aşmadiğini denetleyin
Aşağıdaki örnek kod, bir uygulama geliştiricisinin arka plan görevlerinin uygulama bütçesini tüketmesini izlemek ve bunlara tepki vermek için BackgroundWorkCost.WasApplicationThrottledInStandby ve BackgroundWorkCost.ApplicationEnergyUseLevel'ı nasıl kullanabileceğini gösterir. Uygulama geliştiricisi, modern beklemede yapılan düşük öncelikli işleri azaltarak tepki verebilir. Bunun önceki örnekteki koda bağlı olduğunu unutmayın.
public async void ReduceBackgroundCost()
{
BackgroundTaskRegistration callTask;
BackgroundTaskRegistration notificationTask;
BackgroundTaskRegistration prefetchTask;
// Nothing to do if the app was not or will not be throttled.
if (!BackgroundWorkCost.WasApplicationThrottledInStandby &&
(BackgroundWorkCost.ApplicationEnergyUseLevel != StandbyEnergyUseLevel.OverBudget))
{
return;
}
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
switch (task.Value.Name) {
case IncomingCallTaskName:
callTask = task.Value;
break;
case NotificationTaskName:
notificationTask = task.Value;
break;
case PrefetchTaskName:
prefetchTask = task.Value;
break;
default:
}
}
if (callTask.WasTaskThrottledInStandby)
{
// Unset the throttle flag after acknowledging it so the app can
// react to the same task being throttled again in the future.
task.Value.WasTaskThrottledInStandby = false;
// Notify the user that the notification was missed.
new ToastContentBuilder()
.AddText("You missed a call")
.AddText(task.Value.Name)
.Show();
// Because the incoming calls were not activated, demote less notifications
// tasks so the calls can be delivered promptly in the future.
RegisterTask(notificationTask.Value.Trigger,
typeof(TimeTriggeredTask).GUID,
notificationTask.Value.Name,
false);
}
// Note that if incoming call tasks were throttled in some previous modern
// standby session, the application energy use was over budget for some period.
// Demote unimportant tasks like prefetch work to avoid calls and notifications
// from being throttled.
if (callTask.WasTaskThrottledInStandby) ||
(BackgroundWorkCost.ApplicationEnergyUseLevel == StandbyEnergyUseLevel.OverBudget))
{
RegisterTask(prefetchTask.Value.Trigger,
typeof(TimeTriggeredTask).GUID,
prefetchTask.Value.Name,
false);
}
return;
}
Arka plan görevi enerji kullanım eğilimlerini izleme
Aşağıda, GitHub üzerinde aşağıdaki C++WinRT/C# örnek koduna yönelik artımlı bir uçtan uca güncelleştirme verilmiştir.
Örnek, arka plan görevlerinizin bütçelerini tüketmeye nasıl eğilim gösterdiğini izlemek için BackgroundWorkCost.ApplicationEnergyUseTrend'i nasıl kullanabileceğinizi gösterir. Ayrıca, en pahalı arka plan görevlerinin modern bekleme modunda çalışmasını durdurabilir ve uygulamaları bütçesini çok hızlı kullanıyorsa arka plan görevlerinin modern beklemede çalışmasını önleyebilirsiniz. Bu örnek, önceki örneklerden alınan koda dayanır.
public async void ReduceBackgroundCostPreemptively()
{
BackgroundTaskRegistration mostExpensiveTask = null;
// We can't do anything preemptively since the trend isn't known.
if (!BackgroundWorkCost.IsApplicationEnergyUseTrendKnown)
{
return;
}
// The app is not trending towards being over budget, so this method can
// return early.
if ((BackgroundWorkCost.ApplicationEnergyUseTrend != EnergyUseTrend.OverBudget) &&
(BackgroundWorkCost.ApplicationEnergyUseTrend != EnergyUseTrend.OverHalf))
{
return;
}
// The application is going exceeding its budget very quickly. Demote the
// most expensive task that is not the call task before call tasks start being
// throttled.
if (BackgroundWorkCost.ApplicationEnergyUseTrend == EnergyUseTrend.OverBudget)
{
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if ((task.Value.Name != IncomingCallTaskName) &&
((mostExpensiveTask == null) ||
(mostExpensiveTask.ApplicationEnergyUseTrendContributionPercentage <
task.Value.ApplicationEnergyUseTrendContributionPercentage)))
{
mostExpensiveTask = task.Value;
}
}
}
if (mostExpensiveTask != null)
{
RegisterTask(mostExpensiveTask.Trigger,
typeof(TimeTriggeredTask).GUID,
mostExpensiveTask.Name,
false);
}
// The application is trending toward eventually exceeding its budget. Demote the
// least important prefetch task before calls and notifications are throttled.
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == PrefetchTaskName) {
RegisterTask(task.Value.Trigger,
typeof(TimeTriggeredTask).GUID,
task.Value.Name,
false);
}
}
return;
}
Arka plan görevleri ve ağ bağlantısı
Arka plan göreviniz ağ bağlantısı gerektiriyorsa aşağıdaki önemli noktalara dikkat edin.
Ağ ile ilgili tetikleyiciler
- Bir paket alındığında ve kısa süreli bir görev gerçekleştirmeniz gerektiğinde arka plan görevini etkinleştirmek için SocketActivityTrigger kullanın. Görevi gerçekleştirdikten sonra, arka plan görevi güç tasarrufu sağlamak için sonlandırılmalıdır.
- Bir paket alındığında ve uzun ömürlü bir görev gerçekleştirmeniz gerektiğinde arka plan görevini etkinleştirmek için ControlChannelTrigger kullanın.
Ağ ile ilgili koşullar ve bayraklar
- Ağ yığını çalışana kadar arka plan görevini tetikleme işlemini geciktirmek için arka plan görevinize InternetAvailable koşulunu (BackgroundTaskBuilder.AddCondition) ekleyin. Ağ erişimi sağlanana kadar arka plan görevi yürütülmeyeceği için bu koşul güç tasarrufu sağlar. Bu koşul gerçek zamanlı etkinleştirme sağlamaz.
- Kullandığınız tetikleyiciden bağımsız olarak, arka plan görevi çalışırken ağın çalışır durumda kaldığından emin olmak için arka plan görevinizde IsNetworkRequested değerini ayarlayın. Bu, arka plan görev altyapısına, cihaz Bağlı Bekleme moduna girmiş olsa bile görev yürütülürken ağı çalışır durumda tutmasını söyler. Arka plan göreviniz IsNetworkRequested kullanmıyorsa, arka plan göreviniz Bağlı Bekleme modundayken ağa erişemez.
İlgili içerik
Windows developer