как избежать окна сервера занят, если используется thread.join () в wpf c # - PullRequest
0 голосов
/ 08 марта 2019

У меня есть 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 (). После этого мое окно не отображается.

Я получаю окно занятости сервера, как показано ниже

enter image description here

1 Ответ

0 голосов
/ 08 марта 2019

Вызов Join() блокирует текущий поток. Если вы хотите ждать асинхронно, вы можете использовать SemaphoreSlim:

static async Task ShowWindowAsync()
{
    SemaphoreSlim semaphore = new SemaphoreSlim(0, 1);
    _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.Closed += (s, e) =>
        {
            semaphore.Release();
            semaphore.Dispose();
        };
        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.
    await semaphore.WaitAsync();
}
...