在背景剂不同的静态变量值(Static variable value different in ba

2019-06-26 01:40发布

我有一个应用程序,显示了一些数据,并启动后台代理dinamically更新现场砖。 由于现场的瓷砖在后台代理使用一些变种从主线程填充创建的内容,我决定(也许这是一个错误的决定,但它是唯一一个我认为合理的)写静态变量和主之间的共享属性的类线程和后台代理。 现在的问题是我写在主线程中变量的值,但是当后台代理执行发现本null值。 为什么?
我提供了一个小例子,跳跃这足以让你明白。

静态部分

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 !!
    }
}

后台代理

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();
    }
}

主页

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 Phone从不到一个月的时间,所以我敢肯定,我还是做的非常糟糕的事情......

更新
把正确的锁,以避免并行读/来自不同线程写入之后,我决定把一个明确的静态构造函数静态类

public class Vars
{
    static Vars()
    {
        Debug.WriteLine("init");
    }
}

这被称为每次后台代理调用!
这说明我看到我的空变量的原因,但我不明白:为什么静态类是重新创建每次?
难道是因为后台代理是一个dll项目中(这是必要的运行它)?
有没有一种方法,使一个类,只创造了第一次,这可以在不同的线程之间共享(他们是在这种情况下处理?)?

Answer 1:

经过长时间的搜寻后,我终于找到了一个文章 ,指出:

由于我们的EvenTiles应用程序及其PeriodicTask在单独的进程中运行,它们是彼此完全分开,这意味着他们得到他们自己的,他们都希望访问变量的副本,即使这些变量在一个单独的项目定义。

所以这是不可能的共享使用“简单”的静态变量/属性主要的应用程序和周期性任务之间的数据; 我们必须读/写数据库或独立存储或任何我们请。

我觉得这是疯狂的,但是这是故事。



Answer 2:

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



Answer 3:

我认为加volatile修饰符到您的变量可以解决您的问题。



文章来源: Static variable value different in background agent