C# 在Windows Phone 8.1中以编程方式检测重新启动

C# 在Windows Phone 8.1中以编程方式检测重新启动,c#,windows-phone-8.1,background-process,C#,Windows Phone 8.1,Background Process,我有一个WP 8.1运行时,它启动DeviceUseTrigger后台任务。问题是,每当手机重新启动时,此任务显然会取消,但任务注册仍保持不变。因此,当我下次启动我的应用程序时,后台任务似乎正在运行,而实际上却没有。我需要某种方式来检测手机何时重新启动和/或以某种方式检测任务是否正在实际运行。我用来检查后台任务注册的代码如下: foreach(IBackgroundTaskRegistration task in BackgroundTaskRegistration.AllTasks.Value

我有一个WP 8.1运行时,它启动
DeviceUseTrigger
后台任务。问题是,每当手机重新启动时,此任务显然会取消,但任务注册仍保持不变。因此,当我下次启动我的应用程序时,后台任务似乎正在运行,而实际上却没有。我需要某种方式来检测手机何时重新启动和/或以某种方式检测任务是否正在实际运行。我用来检查后台任务注册的代码如下:

foreach(IBackgroundTaskRegistration task in BackgroundTaskRegistration.AllTasks.Values)
        {
            if ((task as BackgroundTaskRegistration).Name == myTaskName)
            {
                Debug.WriteLine("Task is already running");
            }
        }

我能以一种几乎令人尴尬的简单方式解决这个问题。后台任务在手机关机时取消,因此我在后台任务中为
taskInstane.cancelled
事件附加了一个事件处理程序,并添加了两行内容:

StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("TaskCancelling.txt" CreateCollisionOption.OpenIfExists);
deferral.Complete();
然后,在前台应用程序中,每当应用程序启动时,都会运行以下代码:

foreach(IBackgroundTaskRegistration task in BackgroundTaskRegistration.AllTasks.Values)
{
   if ((task as BackgroundTaskRegistration).Name == myTaskName)
   {
      if (await IsFilePresentInLocalDirectory("TaskCancelling.txt"))
      {
         //Task registration is present, but task isn't actually running.
         //Unregister the useless task
         (task as BackgroundTaskRegistration).Unregister(true);
         //Delete the file
         StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("TaskCancelling.txt");
         await file.DeleteAsync();
         //Relaunch the DeviceUseTrigger task
         RelaunchBackgroundTask();
      }
   }
}

private async Task<bool> IsFilePresentInLocalDirectory(string fileName)
{
   try
   {
      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
      return true;
   }
   catch (Exception exc)
   {
      return false;
   }
}
foreach(BackgroundTaskRegistration.AllTasks.Values中的IBackgroundTaskRegistration任务)
{
if((任务作为BackgroundTaskRegistration).Name==myTaskName)
{
如果(等待IsFilePresentInLocalDirectory(“TaskCancelling.txt”))
{
//任务注册已存在,但任务未实际运行。
//注销无用的任务
(任务作为BackgroundTaskRegistration)。取消注册(true);
//删除该文件
StorageFile file=wait ApplicationData.Current.LocalFolder.GetFileAsync(“TaskCancelling.txt”);
wait file.deleteSync();
//重新启动DeviceUseTrigger任务
重新启动BackgroundTask();
}
}
}
专用异步任务IsFilePresentInLocalDirectory(字符串文件名)
{
尝试
{
StorageFile file=Wait ApplicationData.Current.LocalFolder.GetFileAsync(文件名);
返回true;
}
捕获(异常exc)
{
返回false;
}
}

很明显,我只是创建了一个空文本文件来创建一种任务取消日志,每次我的应用程序启动时,我都会检查文件是否存在。如果是,则重新启动任务并删除文件。

在取消事件中创建文件时,可能会出现“等待”。从技术上讲,如果没有它,延迟可能比文件创建更早完成,可能不会发生,但以防万一。是的,你是对的。我是从记忆中输入代码的,因为项目不在我身边。不管怎样,更正了。我还认为在LocalSettings中使用特殊变量比创建文件更好。访问设置的速度更快,而且是同步操作。