问题描述
我有一个应用程序,显示了一些数据,并启动后台代理dinamically更新现场砖。由于现场的瓷砖在后台代理使用一些变种从主线程填充创建的内容,我决定(也许这是一个错误的决定,但它是唯一一个我以为合理的)写静态变量和主之间的共享属性的类线程和后台代理。
现在的问题是我写在主线程中一个变量的值,但是当后台代理执行发现本null值。为什么呢?结果
我提供了一个小例子,跳跃它足以让你明白。
静态部分
公共类瓦尔
{
公共静态的IEnumerable<联系与GT;联系人;
公共静态无效测试()
{
INT NUM =联系人== NULL? -2:Contacts.Count();
// num是-2这里是因为通讯录是空!
}
}
后台代理
公共类TileAgent:ScheduledTaskAgent
{
保护覆盖无效OnInvoke(ScheduledTask任务)
{
//这是必须使用的BeginInvoke,以避免跨线程错误
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
Vars.Test();
});
NotifyComplete();
}
}
主页
公共部分类的MainPage:的PhoneApplicationPage
{
私人无效Contacts_SearchCompleted(对象发件人,ContactsSearchEventArgs E)
{
busyIndicator.IsRunning = FALSE;
试
{
Vars.Contacts = e.Results
。凡(.........);
ContactResultsData.DataContext = Vars.Contacts;
// Vars.Contacts.Count()= 67在这里!
如果(Vars.GetTile()!= NULL)
StartAgent();
}
赶上(System.Exception的)
{
//这没关系,没有结果
}
}
私人无效ContactResultsData_Tap(对象发件人,GestureEventArgs E)
{
INT NUM = Vars.Contacts == NULL? -2:Contacts.Count();
// NUM = 67在这里!
}
}
这有什么错我的代码?有没有更好的方式来完成我的任务?结果
考虑我的工作在Windows Phone从不到一个月的时间,所以我敢肯定,我还是做的非常糟糕的事情...
更新:结果
把正确的锁,以避免并行读/来自不同线程写入之后,我决定把一个显式静态构造函数以静态类
公共类瓦尔
{
静态瓦尔()
{
的Debug.WriteLine(INIT);
}
}
和这个叫每次后台代理调用!结果
这说明,我看到我的空变量的原因,但我不明白:为什么一个静态类是重建每次结果
难道是因为后台代理是里面? DLL项目(这是必要的运行它)?结果
有没有一种方法,使一个类,仅创造了第一次,这可以在不同的线程之间共享(它们是在这种情况下处理?)
长的搜索后,我终于找到了的说明:
So it's impossible to share data between main app and periodic task using "simple" static variables/properties; we must read/write a database or the isolated storage or whatever we please.
I find this crazy, but this is the story.
这篇关于在后台代理不同的静态变量的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!