我有一个应用程序,它显示一些数据并启动后台代理以动态更新动态磁贴。由于动态磁贴内容是使用从主线程填充的一些 var 在后台代理中创建的,我决定(也许这是一个错误的决定,但这是我认为唯一合理的决定)编写一个具有静态变量和属性的类,以便在主线程之间共享线程和后台代理。
现在的问题是我在主线程中写了一个变量值,但是当后台代理执行时发现这个值为空。为什么?
我提供一个小例子,跳下来让你理解就够了。

静态部分

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

每次调用后台代理时都会调用它!!
这解释了我将变量视为 null 的原因,但我不明白:为什么每次都重新创建静态类?
可能是因为后台代理在 dll 项目中(需要运行它)?
有没有办法制作一个只在第一次创建的类,可以在不同的线程之间共享(在这种情况下它们是进程吗?)?

最佳答案

经过长时间的搜索,我终于找到了一个 article 说明:



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

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

关于c# - 后台代理中静态变量值不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11346576/

10-10 15:33