首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >背景agent中的静态变量值不同

背景agent中的静态变量值不同
EN

Stack Overflow用户
提问于 2012-07-05 14:35:52
回答 3查看 1.1K关注 0票数 3

我有一个应用程序,显示一些数据,并启动一个后台代理,以更新活瓷砖一丁点。由于live内容是在后台代理中使用从主线程填充的某个var创建的,所以我决定(也许这是一个错误的决定,但这是我认为唯一合理的)编写一个具有静态变量和属性的类,以便在主线程和后台代理之间共享。现在的问题是我在主线程中写入一个变量值,但是当后台代理执行时发现这个值为null。为什么?

我举一个很小的例子,跳一跳就够你理解了。

静态部件

代码语言:javascript
复制
public class Vars
{
    public static IEnumerable<Contact> Contacts;
    public static void Test()
    {
        int num = Contacts == null ? -2 : Contacts.Count();
        // num is -2 here because Contacts is null !!
    }
}

背景代理

代码语言:javascript
复制
public class TileAgent : ScheduledTaskAgent
{
    protected override void OnInvoke(ScheduledTask task)
    {
        // It's necessary to use BeginInvoke to avoid Cross-thread errors
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            Vars.Test();
        });

        NotifyComplete();
    }
}

主页

代码语言:javascript
复制
public partial class MainPage : PhoneApplicationPage
{
    private void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
        busyIndicator.IsRunning = false;
        try
        {
            Vars.Contacts = e.Results
                .Where(.........);
            ContactResultsData.DataContext = Vars.Contacts;
            // Vars.Contacts.Count() = 67 here !!!

            if (Vars.GetTile() != null)
                StartAgent();
        }
        catch (System.Exception)
        {
            // That's okay, no results
        }
    }
    private void ContactResultsData_Tap(object sender, GestureEventArgs e)
    {
        int num = Vars.Contacts == null ? -2 : Contacts.Count();
        // num = 67 here !!
   }
}

我的密码怎么了?有更好的方法来完成我的任务吗?

考虑到我在Windows上工作还不到一个月,所以我肯定我还在做非常糟糕的事情.

更新

在放置正确的锁以避免来自不同线程的并发读/写之后,我决定将显式静态构造函数放到静态类中。

代码语言:javascript
复制
public class Vars
{
    static Vars()
    {
        Debug.WriteLine("init");
    }
}

这就是每次调用后台代理时的调用!!

这解释了为什么我将变量视为null,但我不明白:为什么每次都要重新创建静态类?

可能是因为后台代理在dll项目中(运行它是必要的)吗?

是否有一种方法可以在不同线程之间共享(在这种情况下它们是进程吗?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-09 07:58:05

经过长时间的搜索,我终于找到了一个文章,它声明:

由于我们的EvenTiles应用程序和它的PeriodicTask在单独的进程中运行,所以它们彼此完全分离,这意味着它们获得自己想要访问的变量的副本,即使这些变量是在单独的项目中定义的。

因此,使用“简单”静态变量/属性在主应用程序和定期任务之间共享数据是不可能的;我们必须读写数据库或隔离存储或我们喜欢的任何东西。

我觉得这很疯狂,但故事就是这样。

票数 4
EN

Stack Overflow用户

发布于 2012-07-05 15:28:14

您需要同步对共享集合的访问。现在,一个线程可以读取它(通过调用Count(),而另一个线程写),这是非常糟糕的。

票数 1
EN

Stack Overflow用户

发布于 2012-07-05 15:10:57

我认为在变量中添加易失性修饰符可以解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11346576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档