Обновление флажка в Excel 2003 из фонового потока в C # иногда не удается - PullRequest
2 голосов
/ 09 ноября 2009

Я создал надстройку в C #, которая реализует пользовательские функции для Excel. Эти UDF возвращаются немедленно, но они управляют фоновыми асинхронными процедурами.

Эти процедуры имеют статус, который необходимо отслеживать и представлять в Excel. Я выбрал отображение статуса с помощью флажков.

Фоновый поток затем обновляет флажок, связанный с определенной фоновой процедурой.

Я обернул вызовы к модели Excel блоком try / catch и повторил вызов после задержки на случай, если Excel не сгенерирует исключение. Этот механизм также работает правильно.

Проблема в том, что иногда, хотя код для изменения флажка выполняется успешно, сам флажок не изменяется в Excel.

Я сделал проверку исправности атрибутов флажка, которые я изменяю, и вижу, что они не изменились в журналах:

                checkBox.Value = false;
                checkBox.Interior.Color = 0x00DDDDDD; // light grey in AABBGGRR format
                checkBox.Caption = "Off";

                // this sometimes prints the values the checkbox had before the above line
                LogDebug( "Color: " + checkBox.Interior.Color + " Value:" + checkBox.Value + " caption:" + checkBox.Caption );

Это происходит только в Excel 2003. В Excel 2007 проблема как никогда возникла.

Я попытался поиграться с Application.ScreenUpdating, Application.Interactive, без каких-либо везений изменив атрибуты потока COM-квартиры. Это не проблема параллелизма, потому что я нигде не меняю атрибуты флажка.

Как у кого-нибудь был подобный опыт?

Спасибо!

1 Ответ

0 голосов
/ 09 ноября 2009

Ну, я взломал быстрое исправление, которое пока работает нормально, хотя я до сих пор не понимаю, почему это происходит.

На данный момент, если заданные значения не верны после их установки, я рассматриваю это как исключение и помещаю запрос в фоновый поток для будущей попытки.

Код повторяется до тех пор, пока ему не удастся обновить флажок.

Не нравится, но выдает правильное поведение.

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