C# ref变量C的问题

C# ref变量C的问题,c#,winforms,C#,Winforms,我现在有个问题。现在我有两个表单:login和main。每个表单都有自己的notifyIcon,带有show和exit的contextmenu选项,一切都很好,我遵循了这一点使它工作起来。至于登录,有两种方式,用户可以使用表单本身登录,或向连接到笔记本电脑或pc的gsm调制解调器远程发送命令。主窗体有一个计时器,一旦计时器过期,应用程序将隐藏主窗体并显示登录窗体。我的目标权限是同步表格的显示,以实现下列功能: 当用户使用表单登录现场时,成功登录后应显示主表单。 如果用户最小化主窗体,并且计时器过

我现在有个问题。现在我有两个表单:login和main。每个表单都有自己的notifyIcon,带有show和exit的contextmenu选项,一切都很好,我遵循了这一点使它工作起来。至于登录,有两种方式,用户可以使用表单本身登录,或向连接到笔记本电脑或pc的gsm调制解调器远程发送命令。主窗体有一个计时器,一旦计时器过期,应用程序将隐藏主窗体并显示登录窗体。我的目标权限是同步表格的显示,以实现下列功能:

当用户使用表单登录现场时,成功登录后应显示主表单。 如果用户最小化主窗体,并且计时器过期,则应用程序不应向用户显示登录窗体,而应将登录窗体隐藏在系统托盘中,并在用户从托盘中选择时显示 如果应用程序未被激活,则应在会话超时时向用户显示登录表单。 我已经完成了函数1、2和3,它工作得非常好。我使用一个名为minimiseToTrayStatus的ref布尔变量,并相应地更改该变量,然后在登录和主窗体上执行if-else检查,以使功能正常工作。对minimiseToTrayStatus所做的任何更改也将正确反映在其他类上

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

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

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

但是,一种方法是,如果变量发生在不同的线程中,并且变量周围没有设置内存障碍,那么变量如何在一个位置更改而在另一个位置不更新。 见:

在这种情况下,请尝试在更改变量的位置使用锁。锁自动设置记忆屏障。别忘了用一些东西来锁,你们两个地方都可以看到。某些类型的类可能是一个解决方案

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

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

谁最终拥有这个变量?它是如何传播的?一些代码可能会有所帮助。+1表示愿意查看我的线程并为我提供一些建议。我的答案不是关于锁定什么,而是关于使用内存障碍来锁定语句保证。此外,在我作为指导的文章中,有一个很好的解释,什么是好的,什么是坏的。格里沙,你的设计太过分了。因为如果你读了这个问题,你会发现他用了两个地方,这两个地方是最明显的两个不同的类。所以使用一些公共SyncRoot和someyourclass的类型只是设计品味的问题。设计,这与我所做的问题和说明无关。