В настоящее время я пытаюсь выяснить, будет ли FileSystemWatcher выполнять мой синхронный обработчик событий (для нескольких событий) последовательно в одном потоке за раз, поскольку в моем обработчике событий есть код, который не является потокобезопасным.
Исходный код, FileSystemWatcher, кажется, маршалирует обработчики событий в поток, который содержит объект ISynchronizeInvoke, который будет потоком, в котором работает FileSystemWatcher. Однако FileSystemWatcher также использует beginInvoke, что подразумевает асинхронную операцию. Может ли это означать, что несколько обработчиков событий могут выполняться в этом потоке асинхронно, даже если моя реализация обработчика событий не является асинхронной.
protected void OnChanged(FileSystemEventArgs e) {
// To avoid ---- between remove handler and raising the event
FileSystemEventHandler changedHandler = onChangedHandler;
if (changedHandler != null) {
if (this.SynchronizingObject != null && this.SynchronizingObject.InvokeRequired)
this.SynchronizingObject.BeginInvoke(changedHandler, new object[]{this, e});
else
changedHandler(this, e);
}
}
https://referencesource.microsoft.com/#system / services / io / system / io / FileSystemWatcher. cs, 0495f246d39821da, ссылки
Или я неправильно понял использование ISynchronizeInvoke SynchronizingObject. Поскольку в документации для FileSystemWatcher.SynchronizingObject указано:
Когда SynchronizingObject имеет значение NULL, методы, обрабатывающие события Changed, Created, Deleted и Renamed, вызываются в потоке из пула системных потоков.
https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.synchronizingobject?view=netcore-3.1#System_IO_FileSystemWatcher_SynchronizingObject
Кроме того, в документации для ISynchronizeInvoke указано:
Объекты, реализующие этот интерфейс, могут получать уведомление о том, что произошло событие, и могут отвечать на запросы о событии. Таким образом, клиенты могут гарантировать, что один запрос был обработан, прежде чем они отправят следующий запрос, который зависит от выполнения первого.
Кажется, это то, что я ищу, но документация не дает никаких примеров или объяснений того, как это работает.
FileSystemWatcher также реализует буфер событий, но я не мог понять, как он используется, например. извлекаются ли события из буфера только после завершения предыдущего обработчика событий.
Кажется, что запуск кода обрабатывает события последовательно в одном потоке за раз, это то, что я хочу, но я бы хотел убедитесь, что это действительно так. Я не смог найти однозначного ответа в документации FileSystemWatcher, а чтение исходного кода FileSystemWatcher немного выше моего уровня навыков.