我想知道在WinForm中定义事件处理程序的正确方法是什么。我问这个是因为我有一个应用程序,其中只有一些事件处理程序内部有逻辑,其他只调用其他地方定义的方法。这很好吗?我有点担心,因为也许是一个糟糕的设计,在一定的时刻它会给我带来麻烦。内部具有密集逻辑的事件处理程序是一种糟糕的模式吗?
答案 0 :(得分:1)
对Winforms事件处理程序中的操作一般没有限制。但它有副作用,很容易让自己看到,如果你做了很多工作,那么用户界面就会变形紧张。它不再响应鼠标点击,它不再重新绘制自己。大约3秒钟后,Windows将窗体替换为带有“无响应”的重影窗口的表单。
你必须编写大量代码才能触发这种情况,一秒钟就会超过4 十亿机器指令。典型的UI冻结是由等待其他事情来完成工作引起的,例如dbase查询。
这很难看,并没有给人留下深刻的印象。使用您的用户界面会让您感到不舒服。没有什么非常漂亮的用户敲打一个没有响应的按钮。您将使用工作线程器来解决此问题,BackGroundWorker就是为此而设计的。这不是那么容易纠正,只有在你有一个真正需要解决的问题时才使用它。不要假设任何事情。
答案 1 :(得分:0)
在某些情况下,事件处理程序的复杂逻辑很糟糕,但并非总是如此。通常不好的事情是在处理程序中做很多工作来重复数据网格或类似的重绘,这会导致gui闪烁。您可以使这些处理程序异步。 只要你再次保护crossthreadedoperationexceptions,就可以从事件处理程序调用其他方法。 但是,您必须考虑您的架构需求并从那里跳转。
答案 2 :(得分:0)
内部具有密集逻辑的事件处理程序是一种糟糕的模式吗?
如果您自己提出这个问题:是的。可能有一些例外,但UI事件处理程序中的代码太多往往是设计不良的标志。
你应该看看MVP(MVP-Passive View和MVP-Supervising控制器),甚至MVVM和MVC。这些是最“着名”的设计模式,可以将逻辑从演示中分离出来。
就个人而言,我更喜欢WinForms中的MVP-Passive View,但对此有很多意见。