How can I implement IRandomAccessStream in C#?

前端 未结 2 885
失恋的感觉
失恋的感觉 2020-12-19 06:57

I would like to implement an instance of IRandomAccessStream in C# (it will be returning data generated in realtime). The stream does not actually need to be wr

相关标签:
2条回答
  • 2020-12-19 07:35

    How to Convert byte Array to IRandomAccessStream

    I've found this blog article, hopefully this realization of IRandomAccessStream can be a starting point for you.

    class MemoryRandomAccessStream : IRandomAccessStream
    {
        private Stream m_InternalStream;
    
        public MemoryRandomAccessStream(Stream stream)
        {
            this.m_InternalStream = stream;
        }
    
        public MemoryRandomAccessStream(byte[] bytes)
        {
            this.m_InternalStream = new MemoryStream(bytes);
        }
    
        public IInputStream GetInputStreamAt(ulong position)
        {
            this.m_InternalStream.Seek((long)position, SeekOrigin.Begin);
    
            return this.m_InternalStream.AsInputStream();
        }
    
        public IOutputStream GetOutputStreamAt(ulong position)
        {
            this.m_InternalStream.Seek((long)position, SeekOrigin.Begin);
    
            return this.m_InternalStream.AsOutputStream();
        }
    
        public ulong Size
        {
            get { return (ulong)this.m_InternalStream.Length; }
            set { this.m_InternalStream.SetLength((long)value); }
        }
    
        public bool CanRead
        {
            get { return true; }
        }
    
        public bool CanWrite
        {
            get { return true; }
        }
    
        public IRandomAccessStream CloneStream()
        {
            throw new NotSupportedException();
        }
    
        public ulong Position
        {
            get { return (ulong)this.m_InternalStream.Position; }
        }
    
        public void Seek(ulong position)
        {
            this.m_InternalStream.Seek((long)position, 0);
        }
    
        public void Dispose()
        {
            this.m_InternalStream.Dispose();
        }
    
        public Windows.Foundation.IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
        {
            var inputStream = this.GetInputStreamAt(0);
            return inputStream.ReadAsync(buffer, count, options);
        }
    
        public Windows.Foundation.IAsyncOperation<bool> FlushAsync()
        {
            var outputStream = this.GetOutputStreamAt(0);
            return outputStream.FlushAsync();
        }
    
        public Windows.Foundation.IAsyncOperationWithProgress<uint, uint> WriteAsync(IBuffer buffer)
        {
            var outputStream = this.GetOutputStreamAt(0);
            return outputStream.WriteAsync(buffer);
         }
    }
    
    0 讨论(0)
  • 2020-12-19 07:41
    1. Use AsyncInfo.Run(Func<CancellationToken, IProgress<uint>, Task<IBuffer>>) method to create IAsyncOperationWithProgress instance from a delegate.

      public IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
      {    
          if (buffer == null) throw new ArgumentNullException("buffer");
      
          Func<CancellationToken, IProgress<uint>, Task<IBuffer>> taskProvider =
          (token, progress) => ReadBytesAsync(buffer, count, token, progress, options);
      
          return AsyncInfo.Run(taskProvider);
      }
      
      private async Task<IBuffer> ReadBytesAsync(IBuffer buffer, uint count, CancellationToken token, IProgress<uint> progress, InputStreamOptions options)
      {
      ... Fill the buffer here. Report the progress.
          return buffer;
      }
      
    2. Usually you do not need to access the buffer data directly. But in case you need to do this in c# you can use System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions class to copy data to/from a buffer.

    0 讨论(0)
提交回复
热议问题