我的程序的主要组件在主线程中运行。该程序能够将用户的工作保存到文件中,但是随着用户的工作,会保存额外的元信息。
示例:
[Serializable]
public Class UserWork
{
// Lots of things in here. Lots of work user has done, etc...
}
在程序中,我存储了一些诸如设置之类的东西。我们假设它们是bool flag1
和bool flag2
。我有这样的结构:
[Serializable]
public class SavedFile
{
UserWork userWork;
bool flag1;
bool flag2;
}
当我保存时:
saveData(new SavedFile(userWork, flag1, flag2));
加载时:
SavedFile savedFile = SavedFile.Load(path);
UserWork userWork = savedFile.userWork;
bool flag1 = savedFile.flag1;
bool flag2 = savedFile.flag2;
所以基本上,flag1和flag2需要与工作一起保存,但它们不一定属于工作。它们实际上表示用户在保存时的工作流程。
现在,我已经构建了一个AutoSave功能,可以监控用户进行任何修改时触发的事件。 UserWork类触发事件,因此这很容易。我遇到的问题是我不确定如何在AutoSave线程中发送和存储对标志的引用。
我有:
public class AutoSave // (This code runs in a separate thread)
{
bool flag1;
bool flag2;
UserWork userWork;
public AutoSave(UserWork userWork, ref bool flag1, ref bool flag2)
{
this.flag1 = flag1;
this.flag2 = flag2;
this.userWork = userWork;
userWork.workUpdated += new WorkUpdatedHandler(save);
}
void save(object sender, WorkUpdateArgs e)
{
saveDate(new SavedFile(userWork, flag1, flag2));
}
}
当我运行我的代码(不是上面的代码,但代码类似)时,无论主线程中的值是什么,标志都始终为false
。
编辑以澄清:问题不在于我无法使用其他解决方法。例如,我可以在AutoSave类中公开两个标志,并同时更新主标志和自动保存标志。即flag1 = autoSave.Flag1 = true
。相反,问题是这很麻烦。这意味着我必须记住,每次任何标志都会更新。另外,当我只在内存中有一个副本并在几个地方引用它时,用相同的数据更新几个变量是没有意义的。
答案 0 :(得分:2)
你不能像那样使用ref
- 你所展示的代码将无法编译。你 从你的实例变量中取出ref
修饰符。传递给AutoSave
构造函数的任何内容在被分配后完全独立于实例变量。
你可以使用包装类:
public class Wrapper<T>
{
public T Value { get; set; }
}
并传入两个Wrapper<bool>
引用 - 然后调用者可以执行
flag.Value = true;
该更改将在AutoSave
中显示。虽然这很糟糕......如果可以,我会尽量避免这种模式。
无论是什么改变标志也不会引发事件,所以你可以在AutoSave
中捕获那个?