加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C#中实现IRandomAccessStream?

发布时间:2020-12-15 07:45:07 所属栏目:百科 来源:网络整理
导读:我想在C#中实现一个IRandomAccessStream实例(它将返回实时生成的数据).该流实际上不需要是可写的或可搜索的,但我想在ReadAsync方法中返回我自己的数据(它实际上是IInputStream的一部分). public IAsyncOperationWithProgressIBuffer,uint ReadAsync(IBuffer
我想在C#中实现一个IRandomAccessStream实例(它将返回实时生成的数据).该流实际上不需要是可写的或可搜索的,但我想在ReadAsync方法中返回我自己的数据(它实际上是IInputStream的一部分).
public IAsyncOperationWithProgress<IBuffer,uint> ReadAsync(IBuffer buffer,uint count,InputStreamOptions options)
{
    throw new NotImplementedException("To be done");
}

我的两个主要问题是:

>如何返回实现IAsyncOperationWithProgress的内容?框架中是否有任何内容可以帮助解决这个问题?
>如何将数据写入缓冲区? IBuffer只有Length和Capacity属性(具体的Buffer类也不再提供).

解决方法

How to Convert byte Array to IRandomAccessStream

我发现这篇博客文章,希望这个IRandomAccessStream的实现可以成为你的起点.

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,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);
     }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读