我正在开发一个使用ScheduledTaskAgent来更新Live Tile的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
}
Run Code Online (Sandbox Code Playgroud)
该代码在WP7版本中运行良好.:/
这是在我的WMAppManifest.xml文件中:
<ExtendedTask Name="BackgroundTask">
<BackgroundServiceAgent Specifier="ScheduledTaskAgent"
Name="xxxScheduledTask"
Source="xxxScheduledTask"
Type="xxxScheduledTask.SecheduledAgent" />
</ExtendedTask>
Run Code Online (Sandbox Code Playgroud)
在我的计划任务中,我唯一要做的就是调用一个生成磁贴信息的过程,更新磁贴,暂时,我重新运行启动测试,所以我可以看看它是否可以再次更新,虽然我已将此注释掉了 - 我将其取消注释以粘贴到此处,但这已被注释掉了.这是我的OnInvoke方法:
GenerateTileInfo();
#if DEBUG
ScheduledActionService.LaunchForTest(task.ToString(), TimeSpan.FromSeconds(60));
#endif
NotifyComplete();
Run Code Online (Sandbox Code Playgroud)
GenerateInfo方法不会做任何会导致问题的方法,但当然,它永远不会到达那里.我测试了我生成的tile信息并实现它,将该代码放在MainPage.xaml.cs中并立即调用它,看它是否有效,并且我调用的代码工作正常.因此,如果我打开应用程序,则会更新磁贴.现在我需要让后台任务工作.
任何人都可以提供任何帮助非常感谢.另一个线索是,昨晚我收到一个错误,涉及无法找到pdb文件 - 我认为它是Microsoft.Phone.pdb,但不管它是什么,它也提到了System.Windows.ni.dll文件,但现在我没有得到那个pdb问题,只是这个InvalidOperationException.昨晚调试符号(我不知道这意味着什么)没有加载.今天他们是.我不知道我做了什么来解决它.对于我所知道的一切,本可以重启一下.
此外,我尝试创建一个新项目并将我的代码复制到一个新项目,认为我可能有一个损坏的项目文件,但我现在得到的错误与我今天早些时候得到的相同,这促使我创建新的项目.
再次,任何帮助表示赞赏.谢谢. …
我没经验,特别是在MVVM,但尝试使用ReactiveUI,我不理解我发现的演示ReactiveCommand的示例.我曾经使用过一次ICommand/DelegateCommand,但这是不同的,我没有得到它.
我想做的事情非常简单.单击视图中的按钮,然后在视图模型中执行该方法.我发现的所有例子都涉及IObservable <>,我不明白,因为它们没有针对我的总noob的解释.
基本上,我正在尝试将其用作学习体验,而我理想的做法是将xaml中按钮的Command属性绑定到命令(但是这有效,我不知道),这会导致一个方法执行.没有集合,我只是传递一个int变量.
谢谢您的帮助.对此,我真的非常感激.
编辑 - 使用Paul Betts的建议下面显示代码:
C#
public ReactiveCommand AddToDailyUsed { get; protected set; }
public MainPageVM()
{
Initialize();
AddToDailyUsed = new ReactiveCommand();
AddToDailyUsed.Subscribe(AddToTodayUsedAction => this.AddToDailyUsedExecuted());
}
private object AddToDailyUsedExecuted()
{
MessageBox.Show("AddToDailyUsedAction");
return null;
}
private void AddToDailyUsedAction(object obj)
{
MessageBox.Show("AddToDailyUsedAction");
}
Run Code Online (Sandbox Code Playgroud)
XAML
<Button Content="{Binding Strings.add, Source={StaticResource LocalStrings}}"
Command="{Binding AddToTodayUsed}"
Margin="-5,-10, -10,-10"
Grid.Row="3"
Grid.Column="2" />
Run Code Online (Sandbox Code Playgroud)
显然我错过了一些东西.我在AddToDailyUsedExecuted和AddToDailyUsedAction方法中插入了断点,但它们永远不会到达.
编辑构造函数以查看视图后面的代码:
MainPageVM mainPageVM = new MainPageVM();
public MainPage()
{
InitializeComponent();
Speech.Initialize();
DataContext = mainPageVM;
ApplicationBar = new ApplicationBar();
TaskRegistration.RegisterScheduledTask();
this.Loaded …Run Code Online (Sandbox Code Playgroud) 我是第一次尝试使用MVVM.我有一个Windows Phone应用程序(Mango),它有一个模型类,一个视图模型类和一个视图xaml页面.我有控制(文本框)绑定到VM,并且VM绑定到模型.
模型和视图模型都实现INotifyPropertyChanged.我正在使用的实现被复制,以便我可以使用它来试图弄清楚我正在用INPC做什么.以下是两个类中列出的代码:
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
Run Code Online (Sandbox Code Playgroud)
我在Model类中有一个属性,可以手动(从文本框)设置或计算(通过更改其他属性之一).我们称之为一个结果.
如果我更改其他属性之一并逐步执行,则在Model类中的changed属性和重新计算的属性中调用INPC,尽管PropertyChanged是null,因此跳过了部分代码.然后在VM中,已更改的属性逐步执行该类'INPC(作为set访问器的一部分),而这次PropertyChanged不是null,因此PropertyChanged调用该方法.Result但是,对于属性,不会引发INPC(该属性没有由其他属性的set访问器调用的INPC).
这是Model中的一个属性,它不是计算属性:
public int AgeSetting
{
get
{
return (int)GetValueOrDefault(AgeSettingKeyName, AgeSettingDefault);
}
set
{
AddOrUpdateValue(AgeSettingKeyName, value);
Calculate();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是模型中计算值的属性.
public int PointsSetting
{
get
{
return (int)GetValueOrDefault(PointsSettingKeyName, PointsSettingDefault);
}
set
{
AddOrUpdateValue(PointsSettingKeyName, value);
}
}
Run Code Online (Sandbox Code Playgroud)
从ViewModel,这里有两个属性:
public int Age
{
get
{ …Run Code Online (Sandbox Code Playgroud) 我提交失败(甚至无法通过上传验证),因为我的后台代理创建了两个实例,但我无法弄清楚原因.
这是app.xaml.cs中的方法(我也尝试将它定位在MainPageVM.cs和MainPage.xaml.cs中,结果相同)
private void RegisterBackgroundTask()
{
var taskName = "xxUpdater";
var oldTask = ScheduledActionService.Find(taskName) as PeriodicTask;
if (oldTask != null)
{
ScheduledActionService.Remove(taskName);
}
PeriodicTask task = new PeriodicTask(taskName);
task.Description = Strings.xxBackgroundTaskDescription;
oldTask = ScheduledActionService.Find(taskName) as PeriodicTask;
if (oldTask == null)
{
ScheduledActionService.Add(task);
}
//ScheduledActionService.LaunchForTest(taskName, TimeSpan.FromSeconds(60));
}
Run Code Online (Sandbox Code Playgroud)
这是在Application_Launching中的调用:
private void Application_Launching(object sender, LaunchingEventArgs e)
{
{ RegisterBackgroundTask(); }
}
Run Code Online (Sandbox Code Playgroud)
应用程序第一次运行时,我退出,查看,并且有一项任务.然后我再次运行,单步执行,删除调用关闭任务(而不是删除它).当它进入add调用时,它不仅会打开原始任务,而且还会添加另一个.从那时起,当我退出并重新启动应用程序时,删除将关闭一个实例,然后离开另一个实例,并且Add调用将其重新打开.除非在重建或卸载之后,否则oldTask为null.
if(oldTask == old)最初并不存在,我添加它希望它会阻止第二个实例的创建.有时,当我卸载时,仍然有一个后台任务被关闭,我必须关闭手机并重新打开它才能让它消失.
假设我有一个带有ID标识列的表,一些数据和一个日期戳.像这样:
1 data 5/1/2013 12:30
2 data 5/2/2013 15:32
3 data 5/2/2013 16:45
4 data 5/3/2013 9:32
5 data 5/5/2013 8:21
6 data 5/4/2013 9:36
7 data 5/6/2013 11:42
Run Code Online (Sandbox Code Playgroud)
如何编写一个查询,向我显示一个时间戳为5/4的记录?该表有数百万条记录.我做了一些搜索,但我不知道该怎么称呼我正在寻找的东西.:/