我正在开发一个使用 ScheduledTaskAgent 更新动态磁贴的 WP8 应用程序。这是一个非常简单的应用程序,真的。问题是当我直接将代码从 WP7 项目复制到 WP8 项目时,它不会启动 ScheduledTask。不仅如此,如果我正在调试并尝试启动计划任务进行测试,我会收到错误消息。
System.Windows.ni.dll 中发生“System.InvalidOperationException”
不仅如此,它并没有给我任何堆栈查看,并说源不可用,我可以在反汇编窗口中查看反汇编,这对我来说没有任何意义。所以,这不是一个非常有用的错误,IMO。
我尝试在计划任务的构造函数中放置一个断点,但它永远不会在那里。如果我注释掉启动测试,没有错误。但是,当然,将应用程序放在我的手机中,它从未启动,一夜之间就离开了。
这是我的代码:
var taskName = "TileUpdater";
var oldTask = ScheduledActionService.Find(taskName) as PeriodicTask;
if (oldTask != null)
{
ScheduledActionService.Remove(taskName);
}
if (useLiveTile)
{
//GenerateTileInfo();
PeriodicTask task = new PeriodicTask(taskName);
task.Description = AppResources.BackgroundTaskDescription;
oldTask = ScheduledActionService.Find(taskName) as PeriodicTask;
if (oldTask == null)
{
ScheduledActionService.Add(task);
}
#if DEBUG
ScheduledActionService.LaunchForTest(taskName, TimeSpan.FromSeconds(10));
#endif
}
该代码在 WP7 版本中运行良好。:/
这是在我的 WMAppManifest.xml 文件中:
<ExtendedTask Name="BackgroundTask">
<BackgroundServiceAgent Specifier="ScheduledTaskAgent"
Name="xxxScheduledTask"
Source="xxxScheduledTask"
Type="xxxScheduledTask.SecheduledAgent" />
</ExtendedTask>
在我的计划任务中,我唯一要做的就是调用一个生成磁贴信息的过程,更新磁贴,目前,我正在重新运行启动以进行测试,所以我可以观察它是否再次更新,尽管我已将其注释掉 - 我取消注释它以粘贴到此处,但已被注释掉。这是我的 OnInvoke 方法:
GenerateTileInfo();
#if DEBUG
ScheduledActionService.LaunchForTest(task.ToString(), TimeSpan.FromSeconds(60));
#endif
NotifyComplete();
GenerateInfo 方法不会做任何会导致问题的事情,但当然,无论如何它永远不会到达那里。我确实测试了我生成的磁贴信息,并通过将该代码放在 MainPage.xaml.cs 中并暂时调用它来实现它,以查看它是否有效,并且我正在调用的代码工作正常。因此,如果我打开应用程序,磁贴就会更新。现在我需要让后台任务工作。
非常感谢任何人可以提供的任何帮助。另一个线索是,昨晚我收到一个错误,涉及无法找到 pdb 文件 - 我认为它是 Microsoft.Phone.pdb,但不管它是什么,它也引用了 System.Windows.ni.dll文件,但现在我没有得到那个 pdb 问题,只是这个 InvalidOperationException。昨晚调试符号(我不知道那是什么意思)没有加载。今天他们是。我不知道我做了什么来修复它。据我所知,可能是重新启动。
另外,我尝试创建一个新项目并将我的代码复制到一个新项目,认为我可能有一个损坏的项目文件,但我现在得到的错误与我今天早些时候得到的相同,促使我创建新的项目。
再次感谢任何帮助。谢谢。
(编辑 - 美国东部时间 12 月 29 日上午 11:34 在此点下方添加了新评论)=============================== ====================================================
我尝试了另一个实验。我创建了一个新项目,并从http://www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/复制/粘贴代码,看看我是否可以调试应用程序。我确实必须对 Jeff Blankenburg 编写的代码进行一些小的更改,因为他指出,当您添加计划任务项目时,它会自动将以下代码添加到 WMAppManifest.xml 文件中,但它没有。我是手动完成的。
我还在粘贴到 ScheduledAgent.cs 的代码中将StandardTileData类型更改为FlipTileData(因为这是 WP8 项目中的默认值)。
除此之外,Jeff 在他的文章中没有提到的唯一一件事是添加必要的 using 指令。
鉴于这个实验的结果,我想我可能会以某种方式查看我的 Visual Studio 安装已损坏。你会同意吗?我在想卸载/重新安装 VS2012 和手机 sdk 是这里的顺序,但由于需要很长时间,我想获得另一个意见。谢谢。
更新(1/4/2012)=========================================== ======================
卸载VS,通过注册表,然后重新安装VS2012,和手机SDK。这是我现在得到的 - 至少现在它会显示堆栈跟踪:
[本机到托管转换] System.Windows.ni.dll!MS.Internal.JoltHelper.OnUnhandledException(object sender, System.UnhandledExceptionEventArgs args) [托管到本机转换] mscorlib.ni.dll!System.Reflection.RuntimeAssembly.nLoad( System.Reflection.AssemblyName 文件名,字符串 codeBase,System.Security.Policy.Evidence assemblySecurity,System.Reflection.RuntimeAssembly locationHint,ref System.Threading.StackCrawlMark stackMark,System.IntPtr pPrivHostBinder,bool throwOnFileNotFound,bool forIntrospection,bool suppressSecurityChecks) mscorlib。 ni.dll!System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity, System.Reflection.RuntimeAssembly reqAssembly, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder,bool throwOnFileNotFound, bool forIntrospection, bool suppressSecurityChecks) mscorlib.ni.dll!System.Reflection.RuntimeAssembly.InternalLoad(string assemblyString, System.Security.Policy.Evidence assemblySecurity, ref System.Threading.StackCrawlMark stackMark, System.IntPtr pPrivHostBinder, bool forIntrospection ) mscorlib.ni.dll!System.Reflection.RuntimeAssembly.InternalLoad(string assemblyString, System.Security.Policy.Evidence assemblySecurity, ref System.Threading.StackCrawlMark stackMark, bool forIntrospection) mscorlib.ni.dll!System.Reflection.Assembly。加载(字符串 assemblyString)Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentActivator.LoadEntryPointAssembly(字符串 assemblyName)Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentActivator.LoadAgent(字符串 assemblyName,字符串 typeName)Microsoft.Phone。 ni.dll!Microsoft.Phone。BackgroundAgentActivator.Microsoft.Phone.IBackgroundAgentActivator.CreateBackgroundAgent(字符串程序集,字符串类型信息) Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentDispatcher.AgentRequest.Invoke() Microsoft.Phone.ni.dll!Microsoft.Phone.BackgroundAgentDispatcher.InvocationThread () mscorlib.ni.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态) mscorlib.ni.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调,对象状态, bool preserveSyncCtx) mscorlib.ni.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) mscorlib.ni.dll!System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback 回调,对象状态)mscorlib.ni.dll!System.Threading.ThreadHelper.ThreadStart() [原生到托管转换]
还考虑到我使用的是低内存模拟器并且忘记了在低内存设备中不允许使用后台代理,但是我使用哪个模拟器(或设备)没有区别。