所以,我最近接手了一个现有的WinForms应用程序。我们需要将其更改为在系统托盘中运行,但仍然可以在用户需要时弹出窗体。没问题。根据这个问题:使用互斥体确保只运行一个应用程序副本
该应用程序有3个主要组件:自定义应用程序上下文(myContext)处理所有系统托盘内容。myContext创建Gozer类(myGozer)的实例。Gozer执行定时间隔的一系列操作(检查网络状态,如果我们有连接,则执行其他几个操作。它还通过一系列事件告诉其他人正在发生什么。当打开myForm时,myContext会传递myGozer。
当我打开myForm时,我开始遇到各种跨线程问题(任何时候控件以某种方式被使用。例如操纵myListView)。我不清楚最好的处理方法是什么。我对线程知之甚少。我没有一个超级大的脑袋能在30秒内理解线程。我身边也没有人可以吸收他们关于线程的优秀知识。
根据这个问题,我可以简单地检查
我想我真的很担心会在将来创建一堆潜在问题。或者被要求扩展Gozer的功能,然后在myForm中进行工作时创建更多问题。或者发现在运行时打开和关闭myForm会创建一堆额外的跨线程问题。或者该应用程序将导致一切爆炸。
还有其他我应该考虑或遗漏的事情吗?
注意:这是针对一个.NET 2.0应用程序的,所以Jethro的解决方案在这里不起作用。话虽如此,由于我需要编写InvokeRequired逻辑的地方并不是那么多,所以我将只是这样做。我相信在明年我会成功升级到.NET 3.5,并且下面建议的类就是我处理这个问题的方式。因此,我将其标记为答案。
当我打开myForm时,我开始遇到各种跨线程问题(任何时候控件以某种方式被使用。例如操纵myListView)。我不清楚最好的处理方法是什么。我对线程知之甚少。我没有一个超级大的脑袋能在30秒内理解线程。我身边也没有人可以吸收他们关于线程的优秀知识。
根据这个问题,我可以简单地检查
someControl.InvokeRequired
,然后通过委托调用相应的方法。 这有效。但现在我面临的问题是每次需要处理控件时都要添加大量代码,这会引起我脑海中可能校准不良的警报。当我从窗体退出应用程序时,我还发现了一个问题;这会在myContext中引发另一个跨线程异常。我不确定是否仍然适合从myForm退出应用程序,但此时还有哪些其他跨线程疯狂等着我呢?我感觉自己正在为自己制造许多副作用引起的头痛。我想我真的很担心会在将来创建一堆潜在问题。或者被要求扩展Gozer的功能,然后在myForm中进行工作时创建更多问题。或者发现在运行时打开和关闭myForm会创建一堆额外的跨线程问题。或者该应用程序将导致一切爆炸。
还有其他我应该考虑或遗漏的事情吗?
注意:这是针对一个.NET 2.0应用程序的,所以Jethro的解决方案在这里不起作用。话虽如此,由于我需要编写InvokeRequired逻辑的地方并不是那么多,所以我将只是这样做。我相信在明年我会成功升级到.NET 3.5,并且下面建议的类就是我处理这个问题的方式。因此,我将其标记为答案。