#c# #multithreading #winforms #window #dispatcher
#c# #многопоточность #winforms — формы #окно #диспетчер
Вопрос:
У меня есть основное приложение, и я вызываю внешнее приложение через отдельный поток.
Thread thread = new Thread(this.StartExternalApp);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
Я оставляю основное приложение и внешнее приложение простаивающими в течение 10 минут, затем, если я попытаюсь нажать «Сохранить из внешнего приложения», мы вызываем вызов диспетчера основного приложения
userInterfaceDispatcher.Invoke
затем оба приложения перестают отвечать.
Примечание — Но это работает в следующих 2 сценариях
- После простоя обоих приложений, если пользователь выполняет какое-либо действие пользовательского интерфейса в основном приложении и нажимает сохранить во внешнем приложении, тогда вызов диспетчера работает.
- После того, как оба приложения простаивают, если мы показываем messagebox перед вызовом диспетчера, то он работает.
Похоже, нам нужно каким-то образом разбудить диспетчер / основной поток через взаимодействие с пользователем после определенного времени простоя.
Как решить вышеуказанную проблему программно? Я имею в виду, не показывая messagebox или какое-либо взаимодействие с пользовательским интерфейсом.
Комментарии:
1. Какой диспетчер вы имеете в виду? Диспетчер WPF (System. Windows. Многопоточность)? Какое приложение является внешним ? Или какой поставщик синхронизации вы используете, когда нажимаете Сохранить из внешнего приложения ? Можете ли вы показать этот код? (Возможно, также описание того, как эти два приложения должны взаимодействовать).
2. Я использую диспетчер Windows. Просто я использую приложение. Текущий. Диспетчер. Вызов (SaveRecordsInDatabase). Просто для выполнения любого сохранения базы данных мне нужно переключиться на поток пользовательского интерфейса.
3. Итак, вы используете диспетчер WPF (PresentationFramework) для синхронизации приложения WinForms. Они используют разные поставщики синхронизации. Что на практике делает нажатие на сохранение ?
4. Да, Джим прав. Когда мы нажимаем Сохранить во внешнем приложении -> Дело доходит до сохранения события -> там мы пытаемся сохранить элементы в базе данных с помощью диспетчера. Вызов. Он не отвечает точно при вызовах Invoke.
5. Джим, я хотел бы добавить еще один момент. В основном приложении так много модулей. В некоторых модулях у нас есть событие простоя приложения. Выполняется какой-то код. Сложность в том, что если мы отключим все события простоя приложения, я не столкнусь с какой-либо проблемой. Но если я отключу события простоя приложения, это нарушит другие функции.