我有一个响应事件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
不再被调用。
是否有任何类型的限制或类似措施阻止多媒体计时器再次被解雇?
我不知道在哪里看,代码中没有例外,警告或错误。
根据我所获得的信息,我只能假设代码并不重要,但有些条件会影响它。
如果您需要更多代码,请告诉我。