WPF에서 호출된 스레드는 이 대상에 접근할 수 없습니다. 왜냐하면 다른 스레드가 이 대상에 대한 해결 방법을 가지고 있기 때문입니다

1852 단어 솔루션
디버깅 중에 이 오류가 발생한 원인을 나는 인터넷에서 매우 많이 찾았다.대체적으로 요약하면 두 개 이상의 라인이 하나의 컨트롤러를 조작하는 데 발생하는 문제이다.
UI는 WPF에서 스레드와 액세스 스레드를 각각 생성합니다.그래서 위탁 메커니즘으로 해결해야 한다.
다른 스레드에서 컨트롤의 Text 속성을 수정하려면(예: ListBox 컨트롤 유형의lbConnected) 직접 쓰기:lbStatus.Items.Add(str); 그러면 상술한 오류가 발생할 것이다. 
해결 사항은 다음과 같습니다.
AddStringToListBox 함수를 추가하려면:
private delegate void AddStringToListBoxDelegate(string str);
        /// 
        ///  ListBox 
        /// 
        ///  
        private void AddStringToListBox(string str)
        {
            if (!lbStatus.Dispatcher.CheckAccess())
            {
                AddStringToListBoxDelegate d = AddStringToListBox;
                lbStatus.Dispatcher.Invoke(d, str);
            }
            else
            {
                lbStatus.Items.Add(str);
            }
        }

그리고 아까 lbStatus.Items.Add(str); 다음으로 수정
AddStringToListBox(string.Format(" :{0}:{1} ",txtServerIP.Text, port));
안의 매개 변수는 그를 상관하지 마라. 내 프로젝트의 내용이니 너는 너 자신의 매개 변수로 바꿀 수 있다.
그런데 아직도 문제가 생겼어요. 매개 변수에 있는 txtServerIP를 알려 주세요.Text의 오류 정보는 "이전 함수 값 구하기 시간 초과로 함수 값이 비활성화되었습니다. 함수 값을 다시 사용하려면 계속 실행해야 합니다."생각해 보니 역시 같은 이유였다. txt ServerIP와List Box는 같은 성질이기 때문에 인터넷에서 찾아봤는데 이 분의 글이 이 문제를 해결해 주었다. 클릭하면 링크를 열 수 있다.
나는 그의 방법에 따라 코드를 약간 수정했다. 물론 AddStringToListBox의 방법은 수정할 필요가 없다. 단지 호출된 곳에서 수정을 했을 뿐이다. 구체적으로는 다음과 같다.
txtServerIP.Dispatcher.Invoke(
                    new Action(
                        delegate
                        {
                            AddStringToListBox(string.Format(" :{0}:{1} ", txtServerIP.Text, port));
                        }
                        )
                    );
                //AddStringToListBox(string.Format(" :{0}:{1} ",txtServerIP.Text, port));

좋은 웹페이지 즐겨찾기