Как открыть вторую форму в том же потоке первой формы? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть клиент WinForms с 2 формами.Первая форма вызывает отдельный класс, использует SignalR для уведомлений из WebApi.Настройка прокси-сервера-концентратора для определенного сообщения в классе:

onResult = myProxy.On<int>("Result", (id) =>
{
    Result?.Invoke(this, new ResultEventArgs(id));
});

В первой форме я подписываюсь на событие Result, а затем у меня есть:

private void OnResult(object sender, ResultEventArgs e)
{
   using (var form = new SecondForm(e))
   {
       var dialogResult = form.ShowDialog(this);
       if (dialogResult == DialogResult.Cancel)
           return;
   }
}

Я получаю CrossThreadException var dialogResult = form.ShowDialog(this); Первая форма (this) открывается в потоке пользовательского интерфейса.Вторая форма открывается в том же потоке, что и класс SignalR.

Мне нужно открыть вторую форму, используя ShowDialog(this), так как мне нужно, чтобы она была самой верхней формой в приложении.

Есть ли решение этой проблемы?Можно ли также открыть вторую форму в потоке пользовательского интерфейса?

ОБНОВЛЕНИЕ:

Обходной путь, который работает:

form.TopMost = true;                   
form.StartPosition = FormStartPosition.CenterScreen;

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

1 Ответ

2 голосов
/ 25 июня 2019

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

Попробуйте это:

private void OnResult(object sender, ResultEventArgs e)
{
    Action x = () =>
    {
        using (var form = new SecondForm(e))
        {
            var dialogResult = form.ShowDialog(this);
            if (dialogResult == DialogResult.Cancel)
                return;
        }
    };

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