2014-07-08 2 views
1

이벤트의 소비자에게 EventArgs을 통해 버퍼를 수정할 수있는 권한을 부여하려고하지만 솔루션을 제대로 고정 할 수 없습니다. 나는 C/C++로 잘 준비되어 있지만 C#에서는 익숙하지 않다.EventArgs의 수정 된 byte [] 버퍼 반환

내 이벤트 정의는 다음과 같습니다

public class ResponseEventArgs : EventArgs 
{ 
    public byte[] Buffer { get; set; } 

    public ResponseEventArgs(byte[] buffer) 
    { 
     this.Buffer = buffer; 
    } 
} 

public delegate void ResponseEventHandler(object sender, ResponseEventArgs e); 
public event ResponseEventHandler Response; 

내가 함께 이벤트를 발생 :

byte[] buffer = new byte[BUFSIZE]; 

Response(this, new ResponseEventArgs(buffer)); 

내가 UTF8로 변환 샘플 이벤트 핸들러, 교체하고 다시 바이트, 예에 :

void Response_Test(object sender, ResponseEventArgs e) 
{  
    string stringBuf = System.Text.Encoding.UTF8.GetString(e.Buffer); 

    stringBuf = stringBuf.Replace("A", "B"); 

    e.Buffer = new byte[stringBuf.Length * sizeof(char)]; 
    System.Buffer.BlockCopy(stringBuf.ToCharArray(), 0, e.Buffer, 0, 
          e.Buffer.Length);   
} 

이벤트에서 복귀 할 때, 바이트 버퍼는 여전히 이전 내용을 유지합니다.

+1

[매개 변수가 C#으로 전달 (http://yoda.arachsys.com/csharp/parameters.html) 그거야, 내가 조금 해요 – Steve

답변

3

이벤트가 끝나면 buffer 대신 ResponseEventArgs.Buffer을 확인해야합니다. 이유는 귀하의 이벤트 처리기가 ResponseEventArgs 내부에 새로운 버퍼를 만들고 이벤트 호출 전에 생성 한 원래 버퍼가 아닌 해당 버퍼를 수정하고 있기 때문입니다. 새 버퍼를 얻으려면 ResponseEventArgs에서 직접 참조를 가져와야합니다.

여기 그것을 하나 개의 올바른 방법 :

byte[] buffer = new byte[BUFSIZE]; 

//create the event args separately so we can reference it after the raise event call. 
var args = new ResponseEventArgs(buffer); 

Response(this, args); //Raise the event 

//get the current/new buffer from the event args 
var modifiedBuffer = args.Buffer; 
+0

을 오늘 정신이 산만 해. 고맙습니다. –

+1

어쨌든 버퍼를 교체하려고한다면 처음에 버퍼를 할당하는 이유는 무엇입니까? – AlexD

+0

@AlexD 아무 생각도 ... 나는 Op가 단순함을 위해 실제로 원래의 버퍼를 채운 코드를 제거했다고 가정합니다. –