Mar*_*rco 8 c# windows-phone-7
我发布了另一个我无法解决的具体问题.
简而言之:即使我创建了一个静态类(具有静态变量和/或属性),主应用程序和后台代理也不使用相同的静态类,但都创建了它的新实例; 所以这些项目之间无法共享数据!
测试它:
然后使用这个基本的测试代码.
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
类放在代理类和命名空间中,但行为是相同的.
最简单的方法是使用独立存储.例如,从主应用程序:
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来防止数据损坏,因为代理和应用程序是两个独立的进程,可能同时使用隔离存储执行某些操作.
静态变量的值是每个加载的App Domain "实例化"的,它是正在运行的进程的"子集".因此,静态变量每个AppDomain具有不同的值,因此每个运行的进程也是如此.
如果必须在进程之间共享数据,则需要将其存储在某个位置(例如数据库),或者需要在进程之间建立一些通信(例如MSMQ或WCF).
希望这可以帮助.
归档时间: |
|
查看次数: |
7258 次 |
最近记录: |