2011-05-26 68 views
0

我现在有一个问题。现在我有两种形式:登录和主。每个窗体都有自己的notifyIcon,其中包含显示和退出的contextmenu选项,并且一切正常,我遵循此link使其工作。至于登录,用户可以通过两种方式使用表单本身或远程登录(向连接到笔记本电脑或PC的gsm调制解调器发送命令)。主窗体有一个计时器,一旦计时器到期,应用程序将隐藏主窗体并显示登录窗体。我的目标是同步显示表单以实现下列功能:问题与ref变量C#

  1. 当用户使用表单登录时,它应该在成功登录时显示主表单。
  2. 如果用户最小化主窗体,并且计时器到期,则应用程序不应该向用户显示登录表单,而应该将登录表单隐藏在系统托盘中,并在用户从托盘中选择登录表单时显示它
  3. 如果应用程序没有最小化到托盘,那么它应该在会话超时时向用户显示登录表单。

我已经完成了功能1,2和3,它工作得很好。我使用名为minimiseToTrayStatus的ref布尔变量并相应地更改变量,并执行if else检查登录和主窗体以使功能正常工作。在minimiseToTrayStatus上完成的任何更改也会在其他类上正确反映。

现在,我想实现以下功能:

  1. 在接收到远程登录命令,如果登录命令是可见的,那么它应该表现的主要形式。
  2. 在收到远程登录命令后,如果登录命令隐藏在托盘中,那么它也应该隐藏托盘中的主窗体。

当我想实现上述功能1和2我遇到的问题是,一旦接收到远程命令我将试图改变裁判变量minimiseToTrayStatus appropiately得到的功能来完成。我无法获得该功能的工作和调试时,我意识到,一旦收到一个远程命令,当应用程序试图改变minimiseToTrayStatus。在登录和主窗体之间共享的ref变量显示不同的结果?就像一个显示为真,另一个显示为假。我对ref变量的理解是,无论变量在何处发生变化,它都应该在整个程序执行过程中显示一致的结果。我需要它显示相同的结果,这就是为什么我使用ref变量的原因。有人能告诉我为什么ref变量minimiseToTrayStatus显示不同的结果吗?

+1

谁最终拥有这个变量?它是如何传递的?一些代码可能会有所帮助。 – dlev 2011-05-26 05:18:53

回答

0

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

0

它应该工作。 这取决于你如何使用它。因此,如果没有一些代码示例,我不能准确地说。

但是有一种方法,一个变量如何在一个地方被改变,而不是在其他地方被更新,如果它发生在不同的线程上并且变量周围没有设置存储屏障。
请参阅: http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility

在这种情况下,尝试使用周围的地方锁定你改变你的变量。自动锁定内存屏障。并且不要忘记使用一些物体锁定,这是你的两个地方。某些类型的类可能是一种解决方案。

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

-1用于建议锁定类型实例 – 2011-05-26 10:50:25

+0

+1,以便愿意查看我的线索并提供一些建议供我查看。 – abduls85 2011-05-26 14:41:21

+0

我的答案不是关于锁定什么,而是关于使用锁定语句担保的内存障碍。此外,有一个很好的解释是什么是好的,什么是不好的锁定在我作为指导的文章。格里沙,你太过于拧设计了。因为如果你读过这个问题,你可以看到他使用了两个最明确的两个不同类别的地方。因此,使用一些公共的SyncRoot与typeof(SomeYourClass),这只是一个设计品味的问题。设计,这不关心我所做的问题和插图。 – MajesticRa 2011-05-26 14:54:49