У меня есть ошибка. В приложении WinForm .NET2.0 моя HeavyFunction может вызываться из обработчиков событий щелчка мыши. Итак, когда я начинаю быстрый щелчок, у меня происходит сбой при записи файла из-за того, что HeavyFunction введена во второй раз.
Мое решение. Я вспомнил вещи относительно APC и решил синхронизировать вещи честно. То есть Я хочу исключить эффекты APC в HeavyFunction. Итак, я использовал ThreadPool. Для синхронизации я попытался использовать SyncLock (Visual Basic). И не удалось. Мьютексы тоже не работают.
Я просто не могу понять, как моя HeavyFunction может вызываться из одного и того же потока дважды за раз. Но это так. Я думал, что если я использую ThreadPool, то заставляю каждый вызов выполняться в другом потоке.
Определение APC http://msdn.microsoft.com/en-us/library/ms681951%28v=vs.85%29.aspx.
Вот «Справедливость синхронизации потоков в CLR» Джеффри Рихтера (меня тошнит):
http://codeguru.earthweb.com/csharp/.net/net_general/threads/article.php/c4647/Thread-Synchronization-Fairness-in-the-CLR.htm
РЕДАКТИРОВАТЬ: Кажется, я нашел причину исключения аварии. Это антивирус AVG. Вероятно, он считает подозрительной деятельность, когда кто-то щелкает очень быстро, и это вызывает быстрые операции открытия / записи файла. Или это сильно замедляет мой компьютер. В любом случае я не могу воспроизвести сбой, когда AVG отключен. Хотя ProcMon показывает, что AVG имеет доступ к файлу, пока он включен.
Наконец, кто-нибудь может объяснить мне APC? А именно, может ли APC привести к двойному входу в одну и ту же функцию в одном потоке?
Я понял, что это может из этого текста :
«Асинхронный вызов процедуры (APC) - это функция, которая выполняется асинхронно в контексте определенного потока. Когда APC ставится в очередь в поток, система выдает программное прерывание. В следующий раз, когда поток запланирован, он выполнит Функция APC. "
Я боюсь умереть без этого понимания.