0

我正在编写一个记录用户空闲时间的程序,但是当我尝试运行该程序时,它会引发堆栈溢出异常。

这些是我的自定义事件

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());,但是由于我是自定义事件的初学者并且还没有编码,所以我很难解决这个问题C# 很长一段时间。

对此问题的任何和所有帮助将不胜感激!

提前致谢 =]

4

4 回答 4

5

您的处理程序方法在进入时立即调用自身:

this.OnInactive(new EventArgs());

这会导致一系列调用:

OnInactive -> OnInactive -> OnInactive -> ... ->

这将一直持续到您用完堆栈空间并且StackOverflowException运行时抛出 。

目前尚不清楚您要通过递归调用实现什么,但您应该能够将其删除。

您的OnActive处理程序中有同样的问题。

编辑:作为对评论的回应,您似乎正试图在方法开始时引发事件本身。假设您的事件声明如下所示:

public event EventHandler InActive;

然后你可以提高它:

EventHandler inactiveEvent = this.InActive;
if(inactiveEvent != null)
{
    inactiveEvent(this, e);
}

同样适用于您的Active活动。

于 2013-07-03T12:04:38.210 回答
0

这些不是事件处理程序,这些是为了引发活动和非活动事件而调用的方法——Reece Cottam

您需要实际调用该事件。

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 方法,否则你会将太多的实现暴露给程序的其余部分。如果您希望从该类继承,则使它们受到保护,否则我通常将它们完全设为私有,因为它们基本上是由该类的其余部分调用的包装函数。

于 2013-07-03T12:29:14.677 回答
0

我认为您需要的是对事件有更多的了解。让我通过示例代码来解释一下。

Class A{
   public event  OnInactive;
   public event  OnActive;
}

当 classA 发生任何更改时,您希望更新 ClassB 中的内容。因此,您将在 ClassB 中实现类 A 的事件。

链接将详细描述您。

我的理解是,当你从同一个班级触发它并在同一个班级收听时,没有使用事件。

于 2013-07-03T12:29:41.410 回答
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

于 2013-07-03T12:12:44.590 回答