Сборщик мусора удаляет нужные объекты - C#
Формулировка задачи:
Добрый день.
Есть класс, в котором запускается мультимедийный таймер из библиотеки winmm.dll.
При попытке сборки мусора приложение вылетает с ошибкой.: "Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Код:
Где ошибка?
Как узнать какой критический объект удаляется?
PS: В режиме отладки все проходит замечательно и сборка мусорка не вызывает ошибки. Без отладки сразу ошибка на первом же GC.Collect.
public delegate void TimeProc(int id, int msg, int user, int param1, int param2);
public class Timer
{
[DllImport("winmm.dll")]
private static extern int timeBeginPeriod(int msec);
[DllImport("winmm.dll")]
private static extern int timeEndPeriod(int msec);
[DllImport("winmm.dll")]
private static extern int timeSetEvent(int delay, int resolution, TimeProc proc, int user, int mode);
[DllImport("winmm.dll")]
private static extern int timeKillEvent(int id);
private int mTimerId;
private int count = 0;
private string date;
public Timer(string date)
{
this.date = date;
}
public void Start()
{
timeBeginPeriod(1);
int period = 40;
int resolution = 0;
int mode = 1; // 0 for periodic, 1 for single event
mTimerId = timeSetEvent(period, resolution, new TimeProc(TimerCallback), 0, mode);
}
public void Stop()
{
timeKillEvent(mTimerId);
timeEndPeriod(1);
Console.WriteLine("количество тиков: " + count);
}
void TimerCallback(int id, int msg, int user, int param1, int param2)
{
if (count == 140)
{
GC.Collect();
}
count++;
}
}
class Program
{
static void Main(string[] args)
{
Timer timer = new Timer(DateToString.GetDate());
timer.Start();
Thread.Sleep(10000);
timer.Stop();
}
}Решение задачи: «Сборщик мусора удаляет нужные объекты»
textual
Листинг программы
mTimerId = timeSetEvent(period, resolution, new TimeProc(TimerCallback), 0, mode);