2014-07-08 41 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为了简单起见删除了实际填充原始缓冲区的代码。 –