2014-07-08 62 views
1

我想給我的事件消費者修改緩衝區的可能性,通過EventArgs,但我無法正確固定解決方案。我在C/C++中做好了充分的準備,但在C#中缺乏經驗。在EventArgs中返回修改後的字節[]緩衝區

我的事件定義是:

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

事件發生後,您需要檢查ResponseEventArgs.Buffer,而不是您當地的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爲了簡單起見刪除了實際填充原始緩衝區的代碼。 –