фоновые элементы управления рабочего окна не отображаются - PullRequest
2 голосов
/ 01 июня 2010

Есть ли способ загрузить окно внутри фонового рабочего потока без использования showdialog ()? фоновый рабочий завершается только после получения некоторого ввода из окна. Здесь проблема заключается в показе окна, но кнопка и другие элементы управления не отображаются, даже если у нас нет контроля над любым окном.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{
        // acquire form
    Acquire aq = new Acquire(Handle);
        aq.Show();
        do
        {
    // waiting for image

        } while (!aq.isImageReady);      

    // doing Image operation

}

Ответы [ 2 ]

0 голосов
/ 01 июня 2010

Возможно, проблема в том, что вы используете фоновый поток для отображения окна вместо основного потока пользовательского интерфейса процесса. Элементы управления Winform либо генерируют исключения, либо ведут себя некорректно, если они не используются в соответствующем потоке. В этом случае проблема может заключаться в том, что ваше главное окно работает в главном потоке пользовательского интерфейса, в то время как это дополнительное диалоговое окно создается и отображается другим потоком.

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

Чтобы предотвратить дальнейшее продолжение фонового потока, создайте объект System.Threading.AutoResetEvent (a WaitHandle) и вызовите метод WaitOne для этого объекта сразу после вызова события, чтобы уведомить пользовательский интерфейс о показе диалога. Когда пользовательский интерфейс отвечает на ввод пользователя, передавая данные обратно в фоновый поток, этот код может вызвать метод Set объекта AutoResetEvent, что позволяет фоновому потоку продолжить.

0 голосов
/ 01 июня 2010

Вы можете отобразить диалоговое окно перед запуском фонового работника и объявить volatile var, которое вы можете изменить / проверить в фоновом работнике, и поддерживать его в работе до тех пор, пока оно не получит желаемое значение, которое будетдостигается после закрытия диалога.

...