C# 多媒体定时器的限制或它停止随机触发的原因

C# 多媒体定时器的限制或它停止随机触发的原因,c#,timer,callback,multimedia,C#,Timer,Callback,Multimedia,我有一个响应事件X的程序。我需要在毫秒内对此事件做出反应,并执行几次作业。这可能需要30分钟。因此,我创建了一个类,当我收到事件并启动多媒体计时器时,我会ping这个类。 这可以调用多次,但通常最多在同一时间调用6个计时器。我的应用程序启动良好,从不抛出警告/异常,我看不到内存泄漏。。。但是随机的,如果我的应用程序处理了相当多的事件,它就会停止启动多媒体计时器。我可以看到它是如何被调用的,但它不再调用回调函数了。没有例外,什么都没有。为什么会这样?我被困在这里两个星期了 这是我的代码,这是从发生

我有一个响应事件X的程序。我需要在毫秒内对此事件做出反应,并执行几次作业。这可能需要30分钟。因此,我创建了一个类,当我收到事件并启动多媒体计时器时,我会ping这个类。 这可以调用多次,但通常最多在同一时间调用6个计时器。我的应用程序启动良好,从不抛出警告/异常,我看不到内存泄漏。。。但是随机的,如果我的应用程序处理了相当多的事件,它就会停止启动多媒体计时器。我可以看到它是如何被调用的,但它不再调用回调函数了。没有例外,什么都没有。为什么会这样?我被困在这里两个星期了

这是我的代码,这是从发生事件X时触发的类A中截取的代码:

private TimerEventHandler timerClickingWLRef;
private uint timerIdSeating = 0;
...
        private void launchMultiMedia()
    {
        try
        {
            timerRef = new TimerEventHandler(CheckMultiMedia);
            timerId = timeSetEvent(10, 5, timerRef, UIntPtr.Zero, TIME_KILL_SYNCHRONOUS | TIME_PERIODIC);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception: " + ex.InnerException.ToString());
        }
        stopwatch.Start();          
    }


private void CheckMultiMedia(uint id, uint msg, UIntPtr userCtx, UIntPtr uIntPtr, UIntPtr intPtr)
        {
//This part of the code is no longer reached after a bit
            if (IsWindow(h))
            {
            try
            {
                // Must be initialize to false in order to work
                acquiredLock = false;

                System.Threading.Monitor.TryEnter(syncThreadsC, ref acquiredLock);
                if (acquiredLock && continue)
                {
                    if (boolvar)
                    {
                        if (stopwatch.ElapsedMilliseconds < 31000) 
                        {
                            // Do sth very fast
                        }
                        else
                        {
                            StopMultiMedia();
                        }

                    }
                }
            }
            finally
            {
                if (acquiredLockCheck)
                    System.Threading.Monitor.Exit(syncThreadsC);
            }
        }
        else
        {
            StopMultiMedia();
        }
    }
我不明白为什么它开始工作得很好,然后,在应用程序有点忙着触发这些事件之后,它会随机出现,但在停止触发的同时,不会超过5-6次。我可以看到LaunchMultimedia被调用,StopWatch.Start开始工作,但是回调函数不再被调用

是否存在任何类型的限制或类似限制,以防止多媒体计时器再次启动

我不知道在代码中没有异常、警告或错误的地方应该查找

根据我所掌握的信息,我只能假设代码不是那么重要,而是受到某些条件的影响


如果您需要更多的代码,请告诉我。

我只能假设代码没有那么重要-堆栈溢出,这几乎总是错误的假设。这绝对是错误的。您需要对问题进行足够的调试,以缩小问题范围,重现问题,并在此处提供最小的完整代码示例。停止工作可能会被禁用、死锁或其他任何情况。我会注意到,即使使用多媒体计时器,也不能保证在事件发生后的毫秒内执行任意代码。我尽可能地缩小了范围:我意识到回调函数最终会停止调用。我在它之前和之后都编写了console.writelines,但从未调用回调函数,但代码中没有错误。我知道在这个例子中,ms有时可能需要超过10分钟。但一件事需要更长的时间,另一件事是在一定时间后根本不启动,即使它确实达到了这一点。它的行为就像它会使非托管代码崩溃一样,但VS没有捕获/显示任何内容,并且继续执行其余的执行,没有任何问题。我拥有的最小完整代码就是上面的代码。当我说代码没有那么重要是因为我在使用它时看不到错误的东西,感觉有某种限制我已经做了更多的测试:如果很多东西可以触发事件X注意:这只是偶尔发生,比如每分钟一次或两次,它会失败。然而,当我只有1-2件可以触发事件的东西时,它就起作用了。我正在使用wndproc启动事件。有时我会收到一个事件X。我会检查是否要处理该事件,或者不调用多媒体计时器。如果是这样,我创建一个对象并调用multimediatimer。拥有许多触发事件的机会并不意味着拥有相同数量的对象。它们只在我需要多媒体定时器时创建。我不明白为什么性能下降嗯。。。我有3个计时器从一开始就以10毫秒的速度工作,检查窗口。我拥有的窗口越多,所需时间越长,操作系统启动新线程的可能性就越小。我相信这就是问题的答案:太多的低间隔计时器阻止应用程序启动新的计时器。我明天会测试,看我是否正确。
public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposed)
            return;

        // Free any unmanaged objects here.
        if (timerId != 0)
        {
            timeKillEvent(timerId);
            timerId = 0;
        }

        disposed = true;

        if (disposing)
        {
            // Free any other managed objects here.
        }
    }

    ~ClassA()
    {
        Dispose(false);
    }