Использовать ShowDialog (форма), где форма создается в другом потоке? - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть форма, которая используется как диалоговое окно, чтобы быть уверенным, что диалоговое окно получает правильного родителя, используется следующий метод:

this.ShowDialog(myForm);

Проблема заключается в том, что this (моя диалоговая форма) и myForm создаются в различных потоках, и при вызове ShowDialog возникает перекрестное исключение.

this.InvokeRequired = false
myForm.InvokeRequired = true

Как мне справиться с этим? Обязательно ли создавать оба потока в одном потоке пользовательского интерфейса?

Ответы [ 3 ]

4 голосов
/ 24 ноября 2011

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

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

1 голос
/ 24 ноября 2011

Крис предложил правильный подход, но пока вы находитесь там, где вы сейчас находитесь, вы можете попробовать это:

public void ShowMe()
{
 if (_myForm.InvokeRequired)
                _myForm.Invoke(new MethodInvoker(ShowMe));
            else
                this.ShowDialog(_myForm); 
}

Если вышеприведенное не работает, тогда передайте SynchronizationContext из родительской формы в класс, который выполняет ShowDialog, и выполните Invoke для этого.

http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx

В связанной заметке вы, возможно, захотите взглянуть на свой дизайн. Кажется довольно запутанным.

1 голос
/ 24 ноября 2011

Пример кода с самоочевидными переменными:

var logicToInvokeInsideUIThread = new MethodInvoker(() =>
{
    // ...

    ShowDialog(this);

    // ...
};

if (InvokeRequired)
{
    Invoke(logicToInvokeInsideUIThread);
}
else
{
    logicToInvokeInsideUIThread.Invoke();
}

Полагаю, это лучшая логика кода для обработки таких случаев. Иногда Invoke() не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...