ref变量C#的问题

时间:2011-05-26 05:12:27

标签: c# winforms

我现在有一个问题。现在我有2种形式:登录和主要。每个表单都有自己的notifyIcon以及show和exit的contextmenu选项,一切运行正常,我按照link进行操作。至于登录,用户可以通过两种方式使用表单本身或远程登录(向连接到笔记本电脑或PC的gsm调制解调器发送命令)。主窗体有一个计时器,一旦计时器到期,应用程序将隐藏主窗体并显示登录表单。我的目标是同步显示表单以实现下面列出的功能:

  1. 当用户使用表单登录现场时,应该在成功登录后显示主表单。
  2. 如果用户最小化主表单,并且如果计时器到期,则应用程序不应向用户显示登录表单,而应该隐藏系统托盘中的登录表单并在用户从托盘中选择时显示该表单< / LI>
  3. 如果应用程序未最小化到托盘,那么它应该在会话超时时向用户显示登录表单。
  4. 我已经完成了功能1,2和3,它的工作非常好。我使用一个名为minimiseToTrayStatus的ref boolean变量并相应地更改变量,并执行if else检查登录和主窗体以使功能正常工作。对minimiseToTrayStatus所做的任何更改也将在另一个类中正确反映。

    现在我正在尝试实现以下功能:

    1. 收到远程登录命令后,如果登录命令可见,则应显示主窗体。
    2. 收到远程登录命令后,如果登录命令隐藏在托盘中,那么它也应该隐藏托盘中的主窗体。
    3. 当我尝试实现上述功能1和2时遇到的问题是,一旦收到远程命令,我将尝试适当地更改ref变量minimiseToTrayStatus以完成功能。我无法使该功能工作,并且在调试时我意识到一旦收到远程命令并且applciation尝试更改minimiseToTrayStatus。登录和主窗体之间共享的ref变量显示不同的结果?就像一个显示true,另一个显示false。我对ref变量的理解是,无论变量在哪里进行了更改,它都应该在整个程序执行过程中显示一致的结果。我需要它来显示相同​​的结果,这就是我使用ref变量的原因。有人可以告诉我为什么ref变量minimiseToTrayStatus显示不同的结果?

2 个答案:

答案 0 :(得分:0)

它应该工作。 这取决于你如何使用它。所以没有一些代码示例,我不能完全说出来。

但是有一种方式,变量如何在一个地方改变而不在其他地方更新是因为它是从不同的线程发生的,并且变量周围没有设置内存障碍。
看到: http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility

在这种情况下,请尝试在更改变量的位置使用锁定。锁定自动设置内存屏障。并且不要忘记使用一些锁定对象,这可以在两个地方看到。某种类型的类可能是一种解决方案。

   lock(typeof(SomeYourClass)){ ... }

答案 1 :(得分:0)

我设法解决了这个问题。我意识到,当我使用ref变量时,对变量所做的任何更改都将反映在登录类中,但主类中的变量仍然访问之前的值,这是问题的主要来源。因此,为了解决这个问题,我在登录类中使用了一个mutator / accessor用于minimiseToTrayStatus变量,并直接从主类访问它,因此我将始终在minimiseToTrayStatus变量中保持一致的值。因此问题解决了。