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;
}
嘿,謝謝你的答案!我沒有考慮使用太多CPU時間的背景。如果您注意到我使用的觸發器是「UserAway」觸發器,假設用戶離開或設備被鎖定時觸發該任務,則上述代碼存在一個奇怪的行爲。奇怪的事情發生在設備鎖上觸發的任務,但似乎停止任務線程。當解鎖時,後臺任務不應該繼續運行,因爲此設置條件爲「UserNotPresent」。你有沒有看過這個或知道發生了什麼? –
我可以看到,你在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上「應用程序必須放置在鎖定屏幕上,才能使用此觸發器類型成功註冊後臺任務。」 –
這只是一個PC應用程序。是的,我已經把應用程序放在了非常模糊的鎖屏上。當我第一次開始時,我認爲「將應用程序放在鎖定屏幕上」意味着在實際的鎖定屏幕上有一個徽章,所以設備被鎖定,您可以在那裏鏈接到您的應用程序的圖標。這不是大聲笑。爲了使應用始終處於我一直使用的鎖定屏幕上,請等待BackgroundExecutionManager.RequestAccessAsync(),以便每次應用啓動時請求用戶訪問。鏈接,我已經看到:)謝謝你的幫助! –