Использование главной формы в качестве родительской для новой формы, созданной в другом потоке - PullRequest
0 голосов
/ 10 января 2012

У меня есть основная форма, которая запускает поток BackgroundWorker. Пока рабочий работает, я "замораживаю" основную форму и жду, пока она завершит работу, покажет ее прогресс.

В одном из сценариев рабочий может отобразить OpenFileDialog, чтобы пользователь мог выбрать файл. Я использую третий поток для запуска OpenFileDialog и устанавливаю его ApartmentState в STA, потому что OpenFileDialog требует его (выдает исключение, если я этого не делаю), а рабочий ApartmentState - MTA.

Проблема в том, что я хочу передать потоку OpenFileDialog основную форму в качестве параметра, чтобы ее можно было использовать при вызове OpenFileDialog.ShowDialog. Как то так:

public void ThreadProcShowDialog(object param)
{
    Form parent = (Form)param;
    dialog.ShowDialog(parent);
}

Конечно, ShowDialog бросает:

Операция с перекрестными потоками недопустима: элемент управления «Форма» доступен нить, отличная от нити, в которой он был создан.

Как я могу сделать это потокобезопасным способом?

Цель этого заключается в том, что OpenFileDialog будет работать в потоке STA, в то время как основная форма не будет отображаться поверх него (запретить пользователю щелкать форму ниже, таким образом скрывая OpenFileDialog).

Спасибо

1 Ответ

2 голосов
/ 11 января 2012

Нашли!

Сотрудник-программист, работающий со мной, предложил простое решение, которое действительно сработало. Вместо запуска OpenFileDialog в третьем потоке, просто запустите его в главной форме (той, которая запустила рабочий поток.

Это выглядит так:

//Code inside worker method
OpenFileDialog dialog= new OpenFileDialog();
DialogResult result = DialogResult.None;

Invoke(new MethodInvoker(delegate() { result = dialog.ShowDialog(this); }));
if (result == DialogResult.OK)
{
    ...
}

Таким образом я блокирую основную форму от щелчка, и OpenFileDialog запускается в потоке STA.

И думать, что тот, кто решил это, - программист C ++. ; -)

Надеюсь, это кому-нибудь пригодится ...

...