我正在编写一个记录用户空闲时间的程序,但是当我尝试运行该程序时,它会抛出一个Stack Overflow异常。
这些是我的自定义活动
public void OnInactive(EventArgs e)
{
this.OnInactive(new EventArgs());
do
{
var idle2 = GetIdleTime();
GetIdleTime();
System.Diagnostics.Debug.WriteLine(idle2);
}
while (timer.Interval > 5000);
}
public void OnActive(EventArgs e)
{
this.OnActive(new EventArgs());
if (timer.Interval < 5000)
{
var idle3 = GetIdleTime();
System.Diagnostics.Debug.WriteLine(idle3);
}
}
我已经打破了代码,试图找到问题的根源,这似乎位于this.OnInactive(new EventArgs());
内。然而,由于我是Custom的初学者,我对如何解决这个问题非常感兴趣事件并没有在C#编码很长时间。
非常感谢您对此问题的任何帮助!
先谢谢=]
答案 0 :(得分:5)
您的处理程序方法在输入时立即调用自身:
this.OnInactive(new EventArgs());
这会导致一系列调用:
OnInactive - &gt; OnInactive - &gt; OnInactive - &gt; ... - &gt;
将继续运行,直到用完堆栈空间并且运行时抛出StackOverflowException
。
目前还不清楚你要通过递归调用实现什么,但你应该能够删除它。
您的OnActive
处理程序中存在同样的问题。
编辑:在回复评论时,您似乎正试图在方法开头提升事件本身。假设您的事件声明如下:
public event EventHandler InActive;
然后你可以用:
来提高它EventHandler inactiveEvent = this.InActive;
if(inactiveEvent != null)
{
inactiveEvent(this, e);
}
,同样适用于您的Active
活动。
答案 1 :(得分:0)
我猜你试图调用基本方法,但实际上你在点击OnInactive
时正在调用OnInactive
。这种行为是递归的,最终会因StackOverflow exception
而停止。
您可以使用base.<function name>
调用基本功能。
例如:
class SpecialDerived : Base
{
public override void Say()
{
Console.WriteLine("Called from Special Derived.");
base.Say();
}
}
更多信息:http://msdn.microsoft.com/en-us/library/hfw7t1ce(v=vs.71).aspx
答案 2 :(得分:0)
这些不是事件处理程序,这些是将要使用的方法 被调用以提高活动和非活动事件 - Reece 科塔姆
您需要实际调用该事件。
public class ReecesWatcher
{
public event EventHandler ActiveEvent;
public event EventHandler InactiveEvent;
protected virtual void OnInactive(EventArgs e)
{
// Fire the event using the () syntax. Fire it through
// a test variable so that we can reliabilty test for null,
// if there are no subscribers.
EventHandler inactiveEventTest = InactiveEvent;
if (inactiveEventTest != null)
{
inactiveEventTest(this, new EventArgs());
}
do
{
var idle2 = GetIdleTime();
GetIdleTime();
System.Diagnostics.Debug.WriteLine(idle2);
}
while (timer.Interval > 5000);
}
protected virtual void OnActive(EventArgs e)
{
// Fire the event using the () syntax. Fire it through
// a test variable so that we can reliabilty test for null,
// if there are no subscribers.
EventHandler activeEventTest = ActiveEvent;
if (activeEventTest != null)
{
activeEventTest(this, new EventArgs());
}
if (timer.Interval < 5000)
{
var idle3 = GetIdleTime();
System.Diagnostics.Debug.WriteLine(idle3);
}
}
// ... the rest of your class, where you call OnActive and OnInactive to
// cause the events to be fired.
}
我建议不要公开你的OnActive和OnInactive方法,否则你将太多的实现暴露给你的程序的其余部分。如果你希望继承类,那么让它们受到保护,否则我通常将它们完全保密,因为它们基本上是由类的其余部分调用的包装函数。
答案 3 :(得分:0)
我认为你需要的是对事件的更多了解。让我通过示例代码解释相同的内容。
Class A{
public event OnInactive;
public event OnActive;
}
当在classA中发生任何更改时,您想要更新ClassB中的内容。因此,您将在ClassB中实现A类事件。
this链接会详细描述您。
我的理解是,当您从同一个班级触发并在同一个班级听同事时,不会使用任何事件。