2016-02-24 85 views
1

過去一週,我在爲Windows通用項目創建後臺任務方面做了大量工作。我有一個很難,並開始相信,當設備屏幕被鎖定時,不可能觸發後臺任務運行。我正在使用SystemTriggerType.Useraway來觸發後臺任務。我會發布迄今爲止我所擁有的。任何幫助,這將是真棒!C#Windows 8.1後臺在設備屏幕鎖定時運行的任務

這裏是如何,我註冊的後臺任務

public static void RegisterTask() 
    { 
     try 
     { 
      var taskRegistered = false; 
      var builder = new BackgroundTaskBuilder(); 

      foreach (var task in BackgroundTaskRegistration.AllTasks) 
      { 
       if (task.Value.Name == "ResponderBackgroundTask") 
       { 
        Debug.WriteLine(task.Value.Name + " Task Already Registered!!"); 
        taskRegistered = true; 
        break; 
       } 
      } 

      if (!taskRegistered) 
      { 
       builder.Name = "ResponderBackgroundTask"; 
       builder.TaskEntryPoint = "BackgroundGps.BackgroundTask"; 
       builder.AddCondition(new SystemCondition(SystemConditionType.UserNotPresent)); 
       builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable)); 
       builder.SetTrigger(new SystemTrigger(SystemTriggerType.UserAway, false)); 
       builder.CancelOnConditionLoss = true; 
       var register = builder.Register(); 

       register.Completed += new BackgroundTaskCompletedEventHandler(OnComplete); 
      } 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.ToString()); 
      throw; 
     } 
    } 

這裏是backgroundtask:

async public void Run(IBackgroundTaskInstance taskInstance) 
{ 
    taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled); 

    Debug.WriteLine("Inside Run......."); 

    BackgroundTaskDeferral deferral = taskInstance.GetDeferral(); 

    await Geolocate(); 

    deferral.Complete(); 
} 

async static Task<HttpResponseMessage> Geolocate() 
{ 
    Debug.WriteLine("Inside Async Geolocate"); 

    HttpResponseMessage response = new HttpResponseMessage(); 

    Geolocator geolocator = new Geolocator(); 
    geolocator.DesiredAccuracy = (PositionAccuracy) 20; 
    geolocator.DesiredAccuracyInMeters = 30; 

    var networkStatus = NetworkInformation.GetInternetConnectionProfile(); 
    bool status = true; 

    while (status) 
    { 
     networkStatus = NetworkInformation.GetInternetConnectionProfile(); 

     Geoposition position = await geolocator.GetGeopositionAsync().AsTask(); 

     var latitude = position.Coordinate.Point.Position.Latitude; 
     var longitude = position.Coordinate.Point.Position.Longitude; 

     HttpClient client = new HttpClient(); 
     response = await client.GetAsync("http://www.mylocation.com/location?=latitude&longitude"); 
     Debug.WriteLine(response); 

     if (networkStatus == null) 
     { 
      status = false; 
     } 

     if (cancelRequest == true) 
     { 
      return response; 
     } 

     await Task.Delay(15000); 
    } 

    return response; 
} 

回答

0

我在UWP項目的一些問題與後臺任務時,我已經使用了推送通知。

UWPBackgroundTasks的主要問題在於,它們假設非常輕並且消耗的CPU時間不是很多,否則操作系統會關閉它。

我的問題是,我試圖通過使用非常繁重的服務訪問本地數據庫,這花費了CPU時間並且被操作系統關閉。我的日誌在一行中間被切斷,導致我的日誌記錄器不能足夠快地寫入消息。

嘗試在你的BackgroundTask中放置一些日誌,看看他是否被觸發器提升,並尋找可能導致它被取消的沉重操作。

Web請求也可能是問題...

+0

嘿,謝謝你的答案!我沒有考慮使用太多CPU時間的背景。如果您注意到我使用的觸發器是「UserAway」觸發器,假設用戶離開或設備被鎖定時觸發該任務,則上述代碼存在一個奇怪的行爲。奇怪的事情發生在設備鎖上觸發的任務,但似乎停止任務線程。當解鎖時,後臺任務不應該繼續運行,因爲此設置條件爲「UserNotPresent」。你有沒有看過這個或知道發生了什麼? –

+0

我可以看到,你在Windows 8.1上運行它,它是一個電話/ PC?檢查此鏈接是否與您相關https://social.msdn.microsoft.com/Forums/zh-CN/7b4a9862-63c1-4777-94de-60aef025010b/cannot-set-trigger-on-background-task-property- is-always-null?forum = wpdevelop據說在Windows 8.1上「應用程序必須放置在鎖定屏幕上,才能使用此觸發器類型成功註冊後臺任務。」 –

+0

這只是一個PC應用程序。是的,我已經把應用程序放在了非常模糊的鎖屏上。當我第一次開始時,我認爲「將應用程序放在鎖定屏幕上」意味着在實際的鎖定屏幕上有一個徽章,所以設備被鎖定,您可以在那裏鏈接到您的應用程序的圖標。這不是大聲笑。爲了使應用始終處於我一直使用的鎖定屏幕上,請等待BackgroundExecutionManager.RequestAccessAsync(),以便每次應用啓動時請求用戶訪問。鏈接,我已經看到:)謝謝你的幫助! –

相關問題