在EventArgs中返回修改后的byte[]缓冲区

本文关键字:byte 缓冲区 EventArgs 返回 修改 | 更新日期: 2023-09-27 18:12:15

我想让我的事件的消费者有可能通过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);        
}

从事件返回时,字节缓冲区仍然是旧的内容。

在EventArgs中返回修改后的byte[]缓冲区

事件发生后,您需要检查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;