none
Как засинхронизировать доступ к буферу, в который пишет данные один обработчик события, а читает эти данные функция, вызываемая из другого обработчика. RRS feed

  • Вопрос

  • Здравствуйте.

    У меня следующая ситуация. Есть приложние WPF, в окне этого приложения - кнопка. По копке создаётся и запускается тред, назовём его T. В треде T я объявляю библиотечный COM-объект и подписываю его на обработчики событий A и B. Тут первый вопрос: Функции-обработчики событий А и В будут в этом случае выполняться в треде Т ?

    Теперь дальше. В классе окна (из которого по кнопке запускается Т) объявлен буфер, в который пишет данные обработчик А. Когда А закончил выполнение, то запускается обработчик В и из своей последней строки выполняет асинхронный вызов функции F, которая читает данные из буфера и что-то с ними делает. Посколько вызов F асинхронный,то B спокойно завершает свое выполнение, а F - работает дальше. Но тут может опять начать выполняться А и записать новые данные в буфер, из которого F их прочитает, а мне это последнее не нужно, т.к. F должна, вплоть до завершения своего очередного вызова, работать с теми данными в буфере, которые были там в момент этого её вызова. Я конечно могу внутри F объявить ещё один буфер и в начале работы F копировать в него данные из того буфера, в который их пишет A, и затем F будет работать с этим её внутренним буфером. Нл этот подход по-моему несколько грубоват, а оператор lock языка C# здесь вряд ли подойдёт, т.к. получается что и A и F выполняются внутри одного и того же треда. Как тут быть? Посоветуйте, пожалуйста.



    • Изменено TownSparrow 15 июня 2012 г. 10:39
    15 июня 2012 г. 10:38

Ответы

  • По первому вопросу ответ: "Скорее всего они работают в рамках одного потока". Почему скорее всего? Потому, что я не знаю кода COM компонента, может он обработчики в разных потоках стартует...

    По второму вопросу, можете действительно сделать промежуточный буфер и копировать в него посредством развязки через lock. Можете использовать ReadWriteLock.

    • Помечено в качестве ответа TownSparrow 16 июня 2012 г. 9:20
    15 июня 2012 г. 12:10
    Отвечающий