Нет методов потока пользовательского интерфейса: InvalidOperationException - PullRequest
0 голосов
/ 30 октября 2019

У меня проблема с пользовательским интерфейсом в проекте WPF.

Концепция:

Два клиента в C # общаются через чат с сервером Java в Linux.

С одним из клиентов я могу выкинуть другой из чата с помощью «/ kick [пользователь] [причина]». Для получения сокета от отправителя к удаленному пользователю я нахожусь в асинхронном обратном вызове, поэтому я редко работаю в UI-потоке. Так что для решения проблем метода no-ui я использую Dispatcher. Поэтому для закрытия текущего пользовательского интерфейса я делаю

this.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { this.Close(); });

Он работает хорошо, но теперь Мне нужно вызвать другой пользовательский интерфейс (меню подключения для пользователей), но когда я использую " Show ()"метод, который я получаю

   'System.InvalidOperationException' in PresentationCore.dll
   at System.Windows.Input.InputManager..ctor()
   at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
   at System.Windows.Input.KeyboardNavigation..ctor()
   at System.Windows.FrameworkElement.FrameworkServices..ctor()
   at System.Windows.FrameworkElement.EnsureFrameworkServices()
   at System.Windows.FrameworkElement..ctor()
   at System.Windows.Controls.Control..ctor()
   at System.Windows.Window..ctor()

Поэтому я попытался поместить его в Диспетчер тоже

 MainWindow mw = new MainWindow();
 mw.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { mw.Show(); });

Но я получаю ту же ошибку (Система. InvalidOperationException) .

Как это сделать ???

Методы:

Получение пакетов: (не очень полезно, но, может быть, я могу сделать это по-другому ...?

    private void callBack(IAsyncResult aResult)
    {
        String message = "";
        try
        {
            int size = sck.EndReceiveFrom(aResult, ref ip);
            if (size > 0)
            {
                byte[] receive = new byte[1024];
                receive = (byte[])aResult.AsyncState;
                message = Encoding.Default.GetString(receive, 0, 1024);
                //class for execute sockets informations that the server sends
                new Event(message, this);
            }
            byte[] buffer = new byte[1024];
            //restart async task
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ip, new AsyncCallback(callBack), buffer);
        }
        catch (Exception) { }
    }

kickUser:

    public void kickUser(String sender, String reason)
    {
        if (!CheckAccess())
        {
            //working well
            this.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { this.Close(); });
            //And here the System.InvalidOperationException
            MainWindow mw = new MainWindow();
            mw.Show();
            //this.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { mw.Show(); });
            //mw.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate { mw.Show(); });
            //All do the same OperationException error.
        }
        MessageBox.Show("You get kicked by \"" + sender + "\" for: " + reason, "Server: /kick");
    }

1 Ответ

0 голосов
/ 30 октября 2019

Да, я обнаружил проблему!

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

     this.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate
     {
         MainWindow mw = new MainWindow();
         mw.call();
         this.Close();
     });

И вот метод вызова в классе MainWindow (новый пользовательский интерфейс mainнить) ;

    public void call()
    {
        this.Show();
        MessageBox.Show("You get kicked by \"" + "sender" + "\" for: " + "reason", "Server: /kick");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...