15 분마다 실행되고 서비스에 ping을 수행하는 백그라운드 작업을 생성하려면 https://docs.microsoft.com/en-us/windows/uwp/launch-resume/create-and-register-a-background-task 문서를 따르고 있습니다.UWP 백그라운드 작업이 5 회 실행되지 않음
만든 UWP 응용 프로그램의 Package.appmanifest에서
namespace PeriodicBackgroundTask { public sealed class FifteenMinutePeriodicTimer : IBackgroundTask { private static readonly FileLogWriter mWriteLogToFile = new FileLogWriter(); public FifteenMinutePeriodicTimer() { } public void Run(IBackgroundTaskInstance taskInstance) { try { taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled); mDeferral = taskInstance.GetDeferral(); mWriteLogToFile.log("Starting periodic timer at " + DateTime.Now.ToString()); // Calling method to do a Post call to a service. mWriteLogToFile.log("Finishing periodic timer at " + DateTime.Now.ToString()); } catch (Exception ex) { mWriteLogToFile.log("Fifteen Minute periodic timer failed.", ex); } finally { // Adding some buffer for async processes to finish. Task.Delay(TimeSpan.FromSeconds(15)).Wait(); mDeferral.Complete(); } } private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) { mWriteLogToFile.log("Fifteen minute periodic timer is canceled. {0}", reason.ToString()); } } }
항목이의 시작 부분에
<Extension Category="windows.backgroundTasks" EntryPoint="PeriodicBackgroundTask.FifteenMinutePeriodicTimer"> <BackgroundTasks> <Task Type="systemEvent" /> <Task Type="timer" /> </BackgroundTasks> </Extension>
등록 타이머를 제출 IBackgroundTask
를 구현하는 공공 봉인 클래스와 Windows 런타임 구성 요소 프로젝트 App.xaml.cs의 OnLaunched 메서드public async static Task RegisterBackgroundTask() { foreach (var task in BackgroundTaskRegistration.AllTasks) { if (String.Equals(task.Value.Name, TASK_NAME)) { mWriteLogToFile.log("Old version of fifteen minute periodic timer found. Unregistering it."); BackgroundExecutionManager.RemoveAccess(); // Unregistering so that any update in Background task can be applied. task.Value.Unregister(true); break; } } BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync(); if (backgroundAccessStatus == BackgroundAccessStatus.DeniedByUser || backgroundAccessStatus == BackgroundAccessStatus.DeniedBySystemPolicy) { mWriteLogToFile.log("Fifteen minute periodic timer registration failed, due to Request access status."); return; } BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.Name = TASK_NAME; builder.TaskEntryPoint = "PeriodicBackgroundTask.FifteenMinutePeriodicTimer"; builder.SetTrigger(new TimeTrigger(15, false)); builder.CancelOnConditionLoss = false; var backgroundTask = builder.Register(); if (backgroundTask != null) { mWriteLogToFile.log("Fifteen minute periodic timer registration SUCCESSFUL."); } else { mWriteLogToFile.log("Fifteen minute periodic timer registration FAILED."); } }
앱 설치 후 FifteenMinuteBackgroundTimer가 5 회 또는 6 회 실행됩니다. 때로는 5, 때로는 6. Visual Studio를 사용하여 작업을 디버깅하려고 할 때 디버깅 할 수 있습니다. 나는 확실하지 않다, 왜 FifteenMinuteBackgroundTimer는 5의 실행 후에 죽어 가고있다. 아무도 내가 어떻게이 문제를 디버깅 할 수 말해 줄래?
추가 정보 :
윈도우 빌드 : 1607
Microsoft.NETCore.UniversalWindowsPlatform : 5.1.0
응답 해 주셔서 감사합니다. 나는 너의 제안을 시도하고 진전을 보였다. 화면이 항상 켜져있는 상태에서 기기를 충전 상태로두면주기 타이머가 실행 중입니다. 그러나 화면을 잠그고 플러그를 뽑으면주기 타이머가 실행되지 않습니다. – c2tarun
@ c2tarun - 설정, 시스템, 배터리, 응용 프로그램 별 배터리로 이동하여 응용 프로그램을 '항상 실행'으로 변경할 수 있습니다. 이상적은 아니지만 그것이 문제인지 알릴 수 있습니다. –
답장을 보내 주셔서 감사합니다.이 앱에서 내 앱에 LockScreen 앱을 만들었습니다. https://msdn.microsoft.com/en-us/library/windows/apps/hh700416.aspx?f=255&MSPPError=-2147217396 해결 된 것 같습니다. 화면을 잠글 때 백그라운드 작업이 실행되지 않는 문제. 하지만 이상한 일은 작업이 실행 중일 때 네트워크 호출을하지 못하는 것입니다. 나는 그것이 http://stackoverflow.com/questions/39133667/uwp-background-task-httpclient-fails-when-device-screen-is-off와 관련된 것이라고 생각한다. – c2tarun