Tag: 事件

为什么C#中的事件实现默认情况下不使用弱事件模式?

这个问题可能导致猜测性答案,但我认为在c#中实现event背后有一个深思熟虑的设计决策。 只要事件的发布者处于活动状态, c#中的事件模式就会使订阅者保持活动状态。 因此,如果你没有取消订阅,你就会泄漏内存(好吧,并没有真正泄漏 – 但内存仍然不必要地占用)。 如果我想阻止这种情况,我可以取消订阅事件或实现MSDN中提出的弱事件模式。 由于事件模式导致了很多问题(对于初学者?),问题是:为什么决定发布者保留对订阅者的强引用,而不是让它们独立或允许开发人员明确地拥有strong或weak修饰符? 关于这个主题已经有几个问题了,答案听起来很合理,但没有一个真正回答为什么会这样。

C#Windows窗体鼠标事件问题中的自定义控件

我有一个用于Panel控件的mouseenter和mouseleave事件,当鼠标进入时会改变背景颜色,当它离开时会返回白色。 我也在此面板中有Label控件,但当鼠标进入Label控件时,面板的mouseleave事件将触发。 这是有道理的,但是当鼠标位于其区域而其他控件不会影响它时,如何保持Panel的背景颜色相同?

为什么定时器让我的对象保持活着?

前言 :我知道如何解决问题。 我想知道它为什么会出现。 请从上到下阅读问题。 正如我们都应该知道的那样,添加事件处理程序会导致C#中的内存泄漏。 请参阅为什么以及如何避免事件处理程序内存泄漏? 另一方面,对象通常具有相似或相关的生命周期,并且不需要取消注册事件处理程序。 考虑这个例子: using System; public class A { private readonly B b; public A(B b) { this.b = b; b.BEvent += b_BEvent; } private void b_BEvent(object sender, EventArgs e) { // NoOp } public event EventHandler AEvent; } public class B { private readonly A a; public B() { […]

C#类订阅自己发布的事件是不是很糟糕?

我可能只是神经质,但我经常发现自己处于发布事件的类的情况下,我觉得从类本身(例如构造函数)中订阅此事件很方便,而不仅仅是订阅外部课程。 这对我来说听起来很合理,但我无法忍受这种拙劣的做法,因为我总是面对这样一个问题:“为什么不执行你在事件处理程序中提供的动作在激活事件的代码中?“ public class Button { public Button() { this.Click += someHandler; // bad practice? } public event EventHandler Click; public void HandleInput() { if (someInputCondition) { // Perform necessary actions here rather than // subscribing in the constructor? this.Click(this, …); } } } 订阅自己的活动有什么缺点吗?

如何确定用户控件何时完全加载并显示?

stackoverflow上已经有一些类似的问题,但我还没有找到答案 我有一个由几个标签页组成的应用程序。 其中一个我一次只加载了几十个用户控件的列表。 目前我在Load事件中这样做,因为我在加载此页面之前有一点延迟。 我想要做的是使UI更具响应性,并在页面完全加载后填充列表。 有没有办法跟踪用户控件何时完全加载它的内容? VisibleChanged也没有帮助,因为它会在显示任何其他子控件之前触发。 当我开始加载控制列表时,当某些子控件仍然不可见时,这会导致一些丑陋的视觉效果。 编辑 为了使它更清楚。 我在页面容器上有一些子控件,我有一个我想要稍后加载的自定义控件列表。 以下几个答案中描述的两种方法的问题是,当我开始加载控件时,他们不会让容器上的其他子控件显示出来,这就是为什么我会有那些丑陋的效果(我正在这样做BackgroundWorker,但无论如何它必须与主线程交互以向列表添加控件)

这是在C#中引发事件的有效模式吗?

更新 :为了让读者阅读此内容的好处,自.NET 4以来,由于自动生成事件的同步更改,锁定是不必要的,所以我现在就使用它: public static void Raise(this EventHandler handler, object sender, T e) where T : EventArgs { if (handler != null) { handler(sender, e); } } 并提出它: SomeEvent.Raise(this, new FooEventArgs()); 在阅读了Jon Skeet 关于multithreading的文章之后 ,我试图将他提倡的方法封装在一个像这样的扩展方法中引发事件(使用类似的通用版本): public static void Raise(this EventHandler handler, object @lock, object sender, EventArgs e) { EventHandler handlerCopy; lock (@lock) { handlerCopy = […]

在C#中读取事件日志

我正在尝试为我的应用程序EventLoggingApp读取事件日志。 问题是为我的单一来源(EventLoggingApp)读取日志。 此代码读取每个源的日志。 问题是什么? 任何建议? static void ReadEvenLog() { string eventLogName = “Application”; string sourceName = “EventLoggingApp”; string machineName = “Tom”; EventLog eventLog = new EventLog(); eventLog.Log = eventLogName; eventLog.Source = sourceName; eventLog.MachineName = machineName; foreach (EventLogEntry log in eventLog.Entries) { Console.WriteLine(“{0}\n”,log.Source); } }

如何通过样式设置事件function?

我有几个GUI控件元素,其中一些应该在鼠标交互(MouseEnter,MouseLeave)上生成相同的操作(代码隐藏函数调用)。 [edit] 我在我的事件处理程序中执行一些非样式相关的function。 现在我在每个控件中使用事件属性: 由于此示例中的许多控件都调用相同的两个函数“GeneralMouseEnter”和“GeneralMouseLeave”,因此我希望能够定义一个样式或类似的东西来封装该行为。 [编辑 – 澄清] 这应该会在以后成为一种插件。 (将代码和XAML文件包含到任何GUI程序中,并在每个交互式控件元素上设置样式……) 根据我在网络上发现的内容,我可以像本示例中那样使用EventTriggers : 我不知道是否以及如何在一个动作中调用函数。 是否可以通过创建一个带有action + trigger的样式来应用于每个控件来获得此function? 怎么做? 如何为一个控件分配多个样式(用于多个交互事件)? 是否有更简洁的方法来实现这种行为? [编辑] 如果我想在GUI中的所有滑块上进行鼠标交互,我该怎么办?

这怎么可能:在WaitOne中处理OnPaint

我有一个ManualResetEvent 。 有一次,我使用WaitOne等待该事件。 令我惊讶的是,我在WaitOne收到了一个OnPaint事件。 这种情况经常发生。 堆栈跟踪如下所示: 我知道WaitOne会阻塞当前线程,并且在事件触发之前不允许执行任何其他代码。 有人可以解释这里发生了什么吗

C#事件去抖动

我正在收听硬件事件消息,但我需要去除它以避免太多查询。 这是一个发送机器状态的硬件事件,我必须将其存储在数据库中以用于统计目的,并且有时会发生其状态经常变化(闪烁?)。 在这种情况下,我想只存储一个“稳定”状态,我想在将状态存储到数据库之前等待1-2秒来实现它。 这是我的代码: private MachineClass connect() { try { MachineClass rpc = new MachineClass(); rpc.RxVARxH += eventRxVARxH; return rpc; } catch (Exception e1) { log.Error(e1.Message); return null; } } private void eventRxVARxH(MachineClass Machine) { log.Debug(“Event fired”); } 我将这种行为称为“去抖”:等待几次才能真正完成它的工作:如果在去抖时间内再次触发相同的事件,我必须解除第一个请求并开始等待去抖时间以完成第二个事件。 管理它的最佳选择是什么? 只是一次性计时器? 要解释“去抖”function,请参阅以下关键事件的javascript实现: http : //benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/