Windows RT - 后台任务未触发
Windows RT - Background Task Not Firing
我正在为我的 Windows 商店应用程序(Win 8.1 应用程序)执行后台任务。我写了一个非常简单的测试 class,注册它,提示访问,但是当我从调试工具栏选择调试任务时,没有任何反应。我今天也多次等待15分钟,它没有输出任何东西。然而,它显示(从代码的角度来看)任务已注册并且我没有生成任何异常。
后台任务:
public sealed class BGFunMessage : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
Debug.WriteLine("Background " + taskInstance.Task.Name + " Starting...");
}
}
寄存器 Class:
public class RegisterWorkers
{
public static async void Run()
{
var taskRegistered = false;
var taskName = "BGFunMessage";
BackgroundTaskRegistration bTask = null;
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == taskName)
{
//taskRegistered = true;
bTask = (BackgroundTaskRegistration)(task.Value);
bTask.Unregister(true);
break;
}
}
if (!taskRegistered)
{
string entryPoint = typeof(BGFunMessage).FullName;
bTask = RegisterBackgroundTask(entryPoint, taskName);
}
}
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string name)
{
var builder = new BackgroundTaskBuilder();
builder.Name = name;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(new TimeTrigger(15, false));
BackgroundTaskRegistration task = null;
try
{
task = builder.Register();
}
catch (Exception ex)
{
LiveLog.WriteException(ex, LogType.WARNING);
}
return task;
}
}
我如何从我的应用中的页面调用它:
RegisterWorkers.Run();
我试过学习多个教程,但大多数教程都说的是同一件事。我还使用从 GitHub 下载的 MSDN 示例,从表面上看,我没有看到任何使他们的代码与我的代码有任何不同的地方(除了他们的 Register 方法 returns a Task<>)。我能够调试示例项目后台任务,但不能调试我自己的。我在这里做错了什么吗?谢谢
经过几个小时的故障排除,我找到了问题的解决方案。我不确定为什么一定是这种情况,但它确实有效。最初(上面未指定),我在与我的应用程序相同的项目中有后台任务。我能找到的唯一区别是,在我看到的所有地方,后台任务都在 WINDOWS RUNTIME COMPONENT 项目中。我将我的代码提取到自己的项目中,并引用了 .DLL,现在一切正常。
但是我应该注意,如果有人需要此修复程序——现在我无法再像当前那样从 Azure 移动服务访问我的任何数据或 SyncContext。我不知道我需要做什么 re-architect 才能让它现在正常工作,但上面的问题现在已经解决了。
我会假设,您应该始终拥有一个您的主应用程序项目应该引用的共享代码库项目,这样我的后台任务也可以引用共享项目并且我仍然可以访问我的模型和其他数据.
我正在为我的 Windows 商店应用程序(Win 8.1 应用程序)执行后台任务。我写了一个非常简单的测试 class,注册它,提示访问,但是当我从调试工具栏选择调试任务时,没有任何反应。我今天也多次等待15分钟,它没有输出任何东西。然而,它显示(从代码的角度来看)任务已注册并且我没有生成任何异常。
后台任务:
public sealed class BGFunMessage : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
Debug.WriteLine("Background " + taskInstance.Task.Name + " Starting...");
}
}
寄存器 Class:
public class RegisterWorkers
{
public static async void Run()
{
var taskRegistered = false;
var taskName = "BGFunMessage";
BackgroundTaskRegistration bTask = null;
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == taskName)
{
//taskRegistered = true;
bTask = (BackgroundTaskRegistration)(task.Value);
bTask.Unregister(true);
break;
}
}
if (!taskRegistered)
{
string entryPoint = typeof(BGFunMessage).FullName;
bTask = RegisterBackgroundTask(entryPoint, taskName);
}
}
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string name)
{
var builder = new BackgroundTaskBuilder();
builder.Name = name;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(new TimeTrigger(15, false));
BackgroundTaskRegistration task = null;
try
{
task = builder.Register();
}
catch (Exception ex)
{
LiveLog.WriteException(ex, LogType.WARNING);
}
return task;
}
}
我如何从我的应用中的页面调用它:
RegisterWorkers.Run();
我试过学习多个教程,但大多数教程都说的是同一件事。我还使用从 GitHub 下载的 MSDN 示例,从表面上看,我没有看到任何使他们的代码与我的代码有任何不同的地方(除了他们的 Register 方法 returns a Task<>)。我能够调试示例项目后台任务,但不能调试我自己的。我在这里做错了什么吗?谢谢
经过几个小时的故障排除,我找到了问题的解决方案。我不确定为什么一定是这种情况,但它确实有效。最初(上面未指定),我在与我的应用程序相同的项目中有后台任务。我能找到的唯一区别是,在我看到的所有地方,后台任务都在 WINDOWS RUNTIME COMPONENT 项目中。我将我的代码提取到自己的项目中,并引用了 .DLL,现在一切正常。
但是我应该注意,如果有人需要此修复程序——现在我无法再像当前那样从 Azure 移动服务访问我的任何数据或 SyncContext。我不知道我需要做什么 re-architect 才能让它现在正常工作,但上面的问题现在已经解决了。
我会假设,您应该始终拥有一个您的主应用程序项目应该引用的共享代码库项目,这样我的后台任务也可以引用共享项目并且我仍然可以访问我的模型和其他数据.