c# – 如何在我的系统托盘应用程序中正确处理交叉线程问题?
所以,我最近接管了现有的WinForms应用程序.我们需要将其更改为在系统托盘中运行的内容,但在用户需要时仍会弹出表单.没问题.根据这个问题:
Mutex is being used to ensure only one copy of the app is running
该应用程序有3个主要组件:自定义应用程序上下文(myContext),它处理所有系统的杂散. myContext创建一个名为Gozer(myGozer)的类的实例. Gozer做了所有真正的工作.它在一个定时间隔内执行一系列操作(检查网络状态,如果我们有连接,那么它会执行其他一些操作.它还可以播放全球热核战争以获得乐趣).让其他人知道通过一系列事件发生了什么.当myForm打开时,myContext正在传递myGozer. 当我打开myForm时,我开始遇到各种各样的跨线程问题(任何时候以某种方式使用控件.就像操纵myListView一样).我不清楚的是解决这个问题的最佳方法.我对线程知之甚少.我没有超大脑可以在30秒内理解线程.我周围没有任何人可以吃,以吸收他们的线程知识. 根据this question,我可以简单地检查someControl.InvokeRequired,然后通过委托调用有问题的方法.这有效.但是现在每次我需要处理一个控件时,我面临着丢掉一堆代码的问题,这可能会引发一些可能在我头脑中校准不佳的警报.从表单退出应用程序时我也发现了一个问题;这会导致myContext中出现另一个跨线程异常.我不确定从myForm中退出应用程序是否合适,但此时还有哪些其他跨线程的疯狂等待着我?我觉得我正在为很多副作用引起的头痛做好准备. 我想我真的很担心在未来会产生一系列潜在的问题.或被要求扩展Gozer的功能,然后在需要myForm工作时创建更多问题.或者发现在运行时打开和关闭myForm会产生一堆额外的跨线程问题.或者该应用程序将导致一切爆炸. 还有什么我应该考虑或遗失的吗? 注意:这是针对.net 2.0应用程序的,所以Jethro的解决方案在这里不起作用.也就是说,因为我不是很多地方都要编写InvokeRequired逻辑,所以我就是这样做的.我很确定我将在明年升级到.net 3.5,下面建议的课程是我将如何处理他的问题.我将其标记为答案. 解决方法
这是您可以使用的扩展程序.不记得是我把它拿起来了.
像这样称呼它. this.InvokeEx(p=> p.txtbox.Text = "Rad"); public static class ControlExtensions { public static TResult InvokeEx<TControl,TResult>(this TControl control,Func<TControl,TResult> func) where TControl : Control { return control.InvokeRequired ? (TResult)control.Invoke(func,control) : func(control); } public static void InvokeEx<TControl>(this TControl control,Action<TControl> func) where TControl : Control { control.InvokeEx(c => { func(c); return c; }); } public static void InvokeEx<TControl>(this TControl control,Action action) where TControl : Control { control.InvokeEx(c => action()); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |