У меня есть c++ application
и я использую clr
для вызова ниже c# method
. Все идет хорошо, кроме одной вещи. Поскольку wpf window
требуется STA thread
, я пытаюсь создать новый поток с состоянием STA и запустить его. Это делает окно wpf modeless
, даже если окно запускается с show dialog
. Поэтому я попытался использовать thread.join()
, чтобы заставить поток вызывающей стороны ждать, пока поток не завершится или окно не закроется. использование thread.join()
показывает server busy window
через несколько секунд. (Я не выполняю никаких операций, связанных с Интернетом, в моем приложении).
Как сделать так, чтобы вызывающая нить до wait
, пока окно не закроется? или как избавиться от занятого сервером окна?
void ShowWindow()
{
_ownerHandle = Process.GetCurrentProcess().MainWindowHandle;
Thread newWindowThread = new Thread(new ThreadStart(() =>
{
MyWpfWindow window = new MyWpfWindow();
MyWpfWindowViewModel vm = new MyWpfWindowViewModel();
WindowInteropHelper helper = new WindowInteropHelper(window);
helper.Owner = _ownerHandle;
window.DataContext = vm;
window.ShowDialog();
}));
// set the apartment state this will only invoke the WPF window
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
// start the thread
newWindowThread.Start();
//waits this thread here untill the newWindowThread execution completes.
newWindowThread.Join();
}
Кроме того, я попытался с помощью цикла while, как показано ниже, чтобы заблокировать текущий основной поток.
while(!windowShown)
{
}
вместо newWindowThread.join (). После этого мое окно не отображается.
Я получаю окно занятости сервера, как показано ниже