【问题标题】:Returning modified byte[] buffer in EventArgs在 EventArgs 中返回修改后的 byte[] 缓冲区
【发布时间】:2014-08-29 19:24:46
【问题描述】:

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

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

【问题讨论】:

标签: c# arrays arguments eventargs


【解决方案1】:

活动结束后,您需要查看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;

【讨论】:

  • 就是这样,我今天有点分心。非常感谢。
  • 既然要被替换,为什么还要在开头分配缓冲区?
  • @AlexD 不知道...为了简单起见,我假设 Op 删除了实际填充原始缓冲区的代码。
  • @AlexD 您不必必须,这完全取决于ResponseEvent 的合同以及订阅者是否需要预先提供数组。
  • @NathanA 当然我可能是错的,但我的理解是 OP 的最初想法是分配缓冲区,然后让处理程序填充它(在 C++ 中很常见的方式)。您提出了一种更优雅的方法,它完全不需要预先分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 2018-10-01
  • 2015-01-24
  • 2016-07-11
  • 1970-01-01
  • 2012-11-23
  • 2022-01-06
相关资源
最近更新 更多