Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy does my Inject method not inject data to the stream?
    primarykey
    data
    text
    <p>I've written a wrapper class for C# <code>Stream</code> because I want it to be able to inject data to the stream and call a function whenever data is read via ReadAsync(). However the "inject" part does not work and I have no idea why.</p> <pre><code>class ExtendedStream : Stream { private readonly Stream _originalStream; private readonly Action&lt;byte[]&gt; _readCallback; private ManualResetEvent dataInjected = new ManualResetEvent(false); private List&lt;byte&gt; data = new List&lt;byte&gt;(); private int pos = 0; public ExtendedStream(Stream originalStream, Action&lt;byte[]&gt; readCallback) { _originalStream = originalStream; _readCallback = readCallback; } public override async Task&lt;int&gt; ReadAsync(byte[] buffer, int offset, int count, System.Threading.CancellationToken cancellationToken) { var read = await _originalStream.ReadAsync(buffer, offset, count, cancellationToken); _readCallback(buffer); return read; } public void Inject(string text) { data.AddRange(new UTF8Encoding(false).GetBytes(text)); dataInjected.Set(); } private IEnumerable&lt;byte&gt; GetBytes(int count) { int returned = 0; while (returned == 0) { if (pos &lt; data.Count) { while (pos &lt; data.Count &amp;&amp; returned &lt; count) { yield return data[pos]; pos += 1; returned += 1; } } else { dataInjected.Reset(); dataInjected.WaitOne(); } } } public override int Read(byte[] buffer, int offset, int count) { var bytes = GetBytes(count).ToArray(); for (int i = 0; offset + i &lt; buffer.Length &amp;&amp; i &lt; bytes.Length; i++) { buffer[offset + i] = bytes[i]; } return bytes.Length; } public override void Write(byte[] buffer, int offset, int count) { _originalStream.Write(buffer, offset, count); } public override bool CanRead { get { return _originalStream.CanRead; } } public override bool CanSeek { get { return _originalStream.CanSeek; } } public override bool CanWrite { get { return _originalStream.CanWrite; } } public override void Flush() { _originalStream.Flush(); } public override long Length { get { return _originalStream.Length; } } public override long Position { get { return _originalStream.Position; } set { _originalStream.Position = value; } } public override long Seek(long offset, SeekOrigin origin) { return _originalStream.Seek(offset, origin); } public override void SetLength(long value) { _originalStream.SetLength(value); } } </code></pre> <p>Then I am reading the stream with XmlReader like follows.</p> <pre><code>using (XmlReader xmlReader = XmlReader.Create(_extendedStream, new XmlReaderSettings() { Async = true })) { while (await xmlReader.ReadAsync()) { switch (xmlReader.NodeType) { case XmlNodeType.EndElement: if (xmlReader.LocalName.Equals("test")) { _log.Debug("&lt;/test&gt; injected!"); } break; default: break; } } </code></pre> <p>The data is never injected if I call <code>_extendedStream.Inject("&lt;/test&gt;")</code>. Does anyone know why?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload