我想让我的事件的消费者可以通过EventArgs
修改缓冲区,但我无法正确地解决问题。我已经做好了C / C ++的准备,但对C#缺乏经验。
我的活动定义是:
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);
}
从事件返回时,字节缓冲区仍然包含旧内容。
答案 0 :(得分: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;