2012-01-09 2 views
0

는이 같은 NamedPipes을 구현하기 위해 어떤 위임 및 이벤트를 사용 : 나는 양식 클래스에서이 이벤트를 사용하면 (제어 객체에서 상 속됨)

public delegate void MessageReceivedHandler(byte[] message, Client client); 

public event MessageReceivedHandler MessageReceived; 

void ListenForClients() { 

//Do some 

Thread readThread = new Thread(Read) { IsBackground = true }; 

} 

void Read(object clientObj) { 

//Do Some 

if(MessageReceived != null) 
MessageReceived(ms.ToArray(),client); 

} 

구현은 다음과 같습니다

public partial class Form1 : Form { 

public Form1(){ 
    pipeServer.MessageReceived += pipeServer_MessageReceived; 
} 

    void pipeServer_MessageReceived(byte[] message, PipeServer.Client client) { 

     Invoke(new PipeServer.MessageReceivedHandler(Do_pipeServer_MessageReceived), 
        new object[] { message, client }); 
    } 

    public void Do_pipeServer_MessageReceived(byte[] message, PipeServer.Client client) { 
    // Do Some 
    } 
} 

하지만 컨트롤 개체에서 상속되지 다른 클래스에서 이것을 사용하고자 할 때 나는 Invoke 어떤 방법도 나는 EXC 상승하는 호출자 방법 pipeServer_MessageReceived에서 대상 방법 Do_pipeServer_MessageReceived의 구현을 대체 할 수 없습니다 eption, 그래서 당신의 제안은 무엇입니까?

+0

왜 호출해야합니까? 어떤 스레드에서 호출하고 있습니까? – Lloyd

+0

@Lloyd 업데이트 질문 – Saeid

+1

@romkyns 님이 질문에 답변했습니다. PipeServer.MessageReceivedHandler를 직접 호출하는 것이 아니라 UI의 일부를 업데이트하는 경우이 인스턴스에서 Invoke를 호출하면됩니다. – Lloyd

답변

3

두 가지 가능성이 있습니다. GUI 스레드에서 콜백을 호출해야합니다. 그렇지 않은 경우입니다.

콜백의 GUI를 건드리지 않으면 호출에 신경 쓰지 마십시오. 당신이 GUI를 만지지 할 경우

는, 당신은 정의에 의해 에 대한 참조는 업데이트하고 일부 제어 할 수 있어야합니다. 해당 컨트롤에 Invoke으로 전화하십시오. Invoke를 호출하는 컨트롤은 실제로 중요하지 않습니다. 그들은 모두 같은 일을 할 것입니다.