0

我的程序的主要组件在主线程中运行。该程序能够将用户的工作保存到文件中,但是额外的元信息会与用户的工作一起保存。

例子:

[Serializable]
public Class UserWork
{
  // Lots of things in here. Lots of work user has done, etc...
}

在程序中,我存储了一些东西,比如设置等。让我们假设它们是bool flag1and 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需要和作品一起保存,但不一定属于作品。它们实际上代表了用户在保存时完成工作流的程度。

现在,我构建了一个自动保存功能,它可以监控用户进行任何修改时触发的事件。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。相反,问题在于这很麻烦。这意味着我必须记住每次更新任何标志时都这样做。此外,当我可以简单地在内存中保存一份副本并在多个地方引用它时,一直用相同的数据更新多个变量是没有意义的。

4

1 回答 1

2

你不能那样使用ref- 你显示的代码不会编译。您必须ref实例变量中删除修饰符。AutoSave一旦分配了实例变量,传递给构造函数的任何内容就完全独立于实例变量。

可以使用包装类:

public class Wrapper<T>
{
    public T Value { get; set; }
}

并传入两个Wrapper<bool>引用 - 然后调用者可以做

flag.Value = true;

并且这种变化将在AutoSave. 虽然这很讨厌......如果可以的话,我会尽量避免这种模式。

任何改变标志的东西都不能引发事件,所以你可以捕捉AutoSave吗?

于 2011-07-07T05:27:43.023 回答