Я пишу приложение WinForms, которое имеет два режима: консоль или графический интерфейс. Три проекта в одном решении, один для консольного приложения, один для форм пользовательского интерфейса и третий для хранения логики, что оба интерфейса также будут соединены. Консольное приложение работает абсолютно гладко.
Модель, которая содержит выбор пользователя, имеет IList<T>
, где T - локальный объект, Step
, который реализует INotifyPropertyChanged
, поэтому в пользовательском интерфейсе он монтируется в DataGridView. Все хорошо во время выполнения, начальное состояние объектов отображается на экране.
Каждый из Step
объектов является задачей, которая выполняется по очереди; некоторые свойства будут изменены, отражены обратно в IList и переданы в DataGridView.
Это действие в версиях пользовательского интерфейса выполняется путем создания BackgroundWorker, возвращающего события в пользовательский интерфейс. Step
делает это и генерирует объект StepResult
, который является перечислимым типом, указывающим результат (например, Running, NotRun, OK, NotOK, Caveat) и строку для обозначения сообщения (потому что шаг выполнен, но не совсем как ожидается, т.е. с оговоркой). Обычно действия включают взаимодействие с базой данных, но в режиме отладки я случайным образом генерирую результат.
Если сообщение пустое, проблем не возникает, но если я генерирую ответ, подобный этому:
StepResult returnvalue = new StepResult(stat, "completed with caveat")
Я получаю сообщение о том, что к DataGridView обращались из потока, отличного от потока, в котором он был создан. (Я передаю это через пользовательский обработчик, который должен обрабатывать вызов при необходимости - может, это не так?)
Тогда, если я сгенерирую уникальный ответ, например, используя случайное число r
:
StepResult returnvalue = new StepResult(stat, r.ToString());
действия выполняются без проблем, числа четко записываются в DataGridView.
Я сбит с толку. Я предполагаю, что это как-то строковая буквальная проблема, но может кто-нибудь придумать более четкое объяснение?