Сборщик мусора удаляет нужные объекты - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день. Есть класс, в котором запускается мультимедийный таймер из библиотеки winmm.dll. При попытке сборки мусора приложение вылетает с ошибкой.: "Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена." Код:
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();
        }
    }
Где ошибка? Как узнать какой критический объект удаляется? PS: В режиме отладки все проходит замечательно и сборка мусорка не вызывает ошибки. Без отладки сразу ошибка на первом же GC.Collect.

Решение задачи: «Сборщик мусора удаляет нужные объекты»

textual
Листинг программы
mTimerId = timeSetEvent(period, resolution, new TimeProc(TimerCallback), 0, mode);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5