在主应用和定期任务之间共享数据

Mar*_*rco 8 c# windows-phone-7

我发布了另一个我无法解决的具体问题.

简而言之:即使我创建了一个静态类(具有静态变量和/或属性),主应用程序和后台代理也不使用相同的静态类,但都创建了它的新实例; 所以这些项目之间无法共享数据!

测试它:

  • 创建一个新的Windows Phone应用程序(称为AppTest)
  • 添加ScheduledTask项目(称为Agent)
  • AppTest中放置了对项目代理的引用
  • 创建一个新的Windows Phone Library项目(称为Shared)
  • 无论是在AppTest代理把一个参考项目共享

然后使用这个基本的测试代码.

AppTest

private readonly string taskName = "mytest";
PeriodicTask periodicTask = null;

public MainPage()
{
    InitializeComponent();

    Vars.Apps.Add("pluto");
    Vars.Order = 5;

    StartAgent();
}

private void RemoveTask()
{
    try
    {
        ScheduledActionService.Remove(taskName);
    }
    catch (Exception)
    {
    }
}
private void StartAgent()
{
    periodicTask = ScheduledActionService.Find(taskName) as PeriodicTask;
    if (periodicTask != null)
        RemoveTask();
    periodicTask = new PeriodicTask(taskName)
    {
        Description = "test",
        ExpirationTime = DateTime.Now.AddDays(14)
    };

    try
    {
        ScheduledActionService.Add(periodicTask);
        ScheduledActionService.LaunchForTest(taskName, 
                TimeSpan.FromSeconds(10));
    }
    catch (InvalidOperationException exception)
    {
    }
    catch (SchedulerServiceException)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

代理人

protected override void OnInvoke(ScheduledTask task)
{
    if (Vars.Apps.Count > 0) 
        Vars.Order = 1;

    NotifyComplete();
}
Run Code Online (Sandbox Code Playgroud)

共享

public static class Vars
{
    public static List<string> Apps = null;
    public static int Order;

    static Vars()
    {
        Apps = new List<string>();
        Order = -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

当您调试主应用程序时,您可以看到静态类的静态构造函数被调用(这是正确的),但是当调用代理时Vars不是"使用"但是另一次调用构造函数,因此创建一个不同的实例.
为什么?如何在主应用和后台代理之间共享数据?
我已经尝试将Vars类放在代理类和命名空间中,但行为是相同的.

Pet*_*hie 8

最简单的方法是使用独立存储.例如,从主应用程序:

using (Mutex mutex = new Mutex(true, "MyData"))
{
    mutex.WaitOne();
    try
    {
        IsolatedStorageSettings.ApplicationSettings["order"] = 5;
    }
    finally
    {
        mutex.ReleaseMutex();
    }
}
//...
Run Code Online (Sandbox Code Playgroud)

在代理商:

using (Mutex mutex = new Mutex(true, "MyData"))
{
    mutex.WaitOne();
    try
    {
        order = (int)IsolatedStorageSettings.ApplicationSettings["order"];
    }
    finally
    {
        mutex.ReleaseMutex();
    }
}

// do something with "order" here...
Run Code Online (Sandbox Code Playgroud)

您需要使用进程级同步和Mutex来防止数据损坏,因为代理和应用程序是两个独立的进程,可能同时使用隔离存储执行某些操作.

  • MS建议不要使用IsolatedStorageSettings以免数据损坏.请参阅此处的"前台应用程序和后台代理之间的通信":http://msdn.microsoft.com/en-us/library/hh202944(v = vs.92).aspx (3认同)

Maa*_*ten 5

静态变量的值是每个加载的App Domain "实例化"的,它是正在运行的进程的"子集".因此,静态变量每个AppDomain具有不同的值,因此每个运行的进程也是如此.

如果必须在进程之间共享数据,则需要将其存储在某个位置(例如数据库),或者需要在进程之间建立一些通信(例如MSMQ或WCF).

希望这可以帮助.