C#: вызывающий поток не может получить доступ к этому объекту, так как он принадлежит другому потоку - PullRequest
0 голосов
/ 25 марта 2020

Я знаю, что на этот вопрос уже ответили до . Но я попробовал в своем проекте, и это исключение. Я новичок в C#, и я хочу знать, где я делаю неправильно. Заранее спасибо.

Проблема: Я пытаюсь обновить список (lbLine), который присутствует в диалоговом окне. Я запускаю отдельный поток, который декодирует данные, полученные из сокета, и заполняет их в элементе управления списком. Мой пример кода, как показано ниже:

private void AddLine(ref int nLine, ref int nType)
        {
            PLine pLine = new PLine();
            pLine.LineNo = nLine;
            pLine.Type = nType; 
            ((MainWindow)System.Windows.Application.Current.MainWindow).pConnect.lbLine.Dispatcher.Invoke(() =>
            {
                Dictionary<string, PConn> pConnList =
                          ((MainWindow)System.Windows.Application.Current.MainWindow).PConnList;

                if (((MainWindow)System.Windows.Application.Current.MainWindow).pConnect != null)
                {
                    bool isPCUExist = pConnList.ContainsKey(((MainWindow)System.Windows.Application.Current.MainWindow).pConnect.tbIPAddress.Text);
                    if (isPCUExist && pConnList[((MainWindow)System.Windows.Application.Current.MainWindow).pcuConnect.tbIPAddress.Text].IsConnected)
                    {
                        PConn pConn = pConnList[((MainWindow)System.Windows.Application.Current.MainWindow).pConnect.tbIPAddress.Text];
                        if (pConn != null)
                        {
                            pConn.AddPLineNo(pLine);
                        }
                    }

                }
            });

        }

1 Ответ

1 голос
/ 25 марта 2020

Попробуйте использовать

Application.Current.Dispatcher.Invoke

вместо

(MainWindow)System.Windows.Application.Current.MainWindow).pConnect.lbLine.Dispatcher.Invoke

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

Обычно существует только один поток UI / Main, поэтому все диспетчеры или другие способы перемещения выполнения в него будут эквивалентны.

...