多媒体计时器限制或其停止随机触发的原因

时间:2015-10-12 23:10:33

标签: c# timer callback multimedia

我有一个响应事件X的程序。我需要在ms内对此事件做出反应并做几次工作。这可能需要30英寸。因此,我创建了一个类,当我收到该事件时,我会启动一个多媒体计时器。 这可以被调用多次,但通常最多同时最多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();
        }
    }

为了在删除对象时避免使用NullReferenceException,我实现了一种处置模式:

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);
    }

我不明白为什么它开始运行良好然后,随机(在应用程序似乎有点忙于触发这些事件,但同时从不超过5-6)它停止触发。我可以看到LaunchMultimedia()被调用,StopWatch.Start()开始工作,但是the callback function不再被调用。

是否有任何类型的限制或类似措施阻止多媒体计时器再次被解雇?

我不知道在哪里看,代码中没有例外,警告或错误。

根据我所获得的信息,我只能假设代码并不重要,但有些条件会影响它。

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

0 个答案:

没有答案