2017-05-26 165 views
1

在我的應用程序中,應用程序和後臺任務都會訪問一個文件,並且首先打開文件,另一個將會失敗。如何在應用程序啓動時停止後臺任務?

爲了避免發生這種情況,我想在用戶打開應用程序時停止後臺任務,並且如果應用程序已經打開,則不要運行後臺任務。

如何知道從後臺任務,如果應用程序正在運行或不?以及如何在應用程序啓動之前阻止它?謝謝。


我這是怎麼註冊的後臺任務:

var result = await BackgroundExecutionManager.RequestAccessAsync(); 

var builder = new BackgroundTaskBuilder(); 
builder.Name = taskName; 
builder.TaskEntryPoint = taskEntryPoint; 
builder.SetTrigger(trigger); 
builder.AddCondition(condition); 

BackgroundTaskRegistration task = builder.Register(); 

有一個UserNotPresent condition指定用戶,如果不存在該任務只能運行。但目前我不明白這意味着用戶正在使用該應用程序或使用電話。

+0

[This](https://stackoverflow.com/questions/38555407/check-if-application-is-running-from-a-background-task/38560015#38560015)可能會有所幫助。 –

回答

0

UserNotPresent條件表示用戶當前未使用整個設備。

您的任務是進行中的後臺任務還是進程外後臺任務? 我建議使用進程內任務以避免困難的跨進程通信場景並簡化項目結構。

返回確定是否一個應用程序從一個後臺任務達的實際問題:

對於進程的任務,你可以檢查應用程序的可見性狀態,看它是否是在前臺。這可以通過幾種不同的方式完成:

  • 在LeavingBackground中將IsInForeground標誌設置爲true,然後在EnteredBackground中將其設置爲false。然後,您可以檢查該標記以查看應用程序是否在前臺運行。
  • 使用窗口的可見性。使用CoreWindow.GetForCurrentThread()。Visible或Window.Current.Visible將使您能夠查看應用程序是否在前臺,最小化或在後臺運行無頭。在前景時都是如此,在最小化時爲真。 CoreWindow.GetForCurrentThread()將返回null,並嘗試訪問Window.Current將在應用程序無頭時引發異常。

對於進程外任務,您可以與前臺應用程序進行通信以確定它是否存在。 Check if application is running from a background task

如何停止後臺任務

確保從後臺任務實例的延遲釋放,然後就從你的主要方法返回(無論是運行:這可以使用的方法之一,建議在這裏完成()用於out-of-proc或BackgroundActivated()用於in-proc)。如果在這個過程中沒有別的東西在運行,那麼它將退出。

相關問題