2012-01-19 2 views
0

모든 데이터를 TCP 연결을 모니터링하고 전체 메시지가 수신 된 경우 이벤트를 실행하는 프로그램이 있습니다. 리스너가 UI 스레드와 다른 스레드에 있습니다. 이벤트가 발생하면 메시지에 UI 변경이 필요하면 현재 변경 사항으로 Form을 호출합니다. 이 호출에 적중이 발생하면 이벤트를 트리거 한 리스너의 함수는 유효하지 않은 오류 인 크로스 스레드 조작을 플래그합니다. 내가 그 오류를 피하려고 할 때 이벤트를 호출 한 스레드가 그 오류를 표시하는 이유를 이해하지 못한다. 예 : 명령의 호출없이크로스 스레드 작업 "폴백"

:

if (cmd == "NEWID") 
{ 
    usr = new User(usr.Name, int.Parse(NW_Connector.GetWord(msg, 1))); 
    this.Text = "Note It - " + usr.Name + "(" + usr.ID + ")"; //Cross-Thread Here 
} 

크로스 스레드가 this.Text 변화에 있었 네요.

난 호출을 추가 할 때 :

if (cmd == "NEWID") 
{ 
    usr = new User(usr.Name, int.Parse(NW_Connector.GetWord(msg, 1))); 
    this.Invoke(new MethodInvoker(delegate { this.Text = "Note It - " + usr.Name + "(" + usr.ID + ")"; })); 
} 

크로스 쓰레드가 이벤트 트리거 함수에 신고되어

if (NewMessage != null && NetworkConnectionState != ConnectionState.Closing) 
    NewMessage(this, cl, data); //Cross-Thread Here 

은 newMessage 기능에 등록 된 이벤트이다

public delegate void RecievedMessage(object sender, Client messageSender, byte[] message); 
    public event RecievedMessage NewMessage; 

올바른 t를 호출 할 때 크로스 스레드가 "이동"된 이유를 이해하지 못합니다. hread. 어떤 도움이라도 환상적입니다!

+0

'NewMessage' 기능은 무엇을합니까? 그것은 어떻게 생겼어? –

+0

NewMessage는에 등록 된 이벤트입니다. 해당 정보가있는 원래 게시물을 수정했습니다. – Skintkingle

답변

0

필자는 그 이유를 전혀 알지 못했지만 전체 재구성 작업을 수행했습니다 (솔루션의 모든 프로젝트 다시 작성). 문제를 해결했습니다. 이 문제는 내가 변경 한 프로젝트의 소스 코드가 스택 추적에서 사용 가능한 가장 가까운 유효한 소스 코드에서 크로스 스레드 오류를 보여주는 운영 프로그램 소스와 다르기 때문에 발생했을 것입니다.

이상한 나는 소스 코드가 다르다는 경고를받지 못했다. 그러나 문제는 해결되었다. 나는 이것이 다른 누군가에게 똑같은 문제를 도울 수 있기를 바랍니다. Cross-Thread 이슈가 스택 추적의 이전 위치로 "떨어지는 것"으로 나타나는 이유는 정말 놀랬습니다.

관련 문제