Вызывает ли FileSystemWatcher обработчики событий последовательно в одном потоке за раз - PullRequest
0 голосов
/ 03 августа 2020

В настоящее время я пытаюсь выяснить, будет ли 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 немного выше моего уровня навыков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...