7

のインスタンスをC#で実装したいと思いますIRandomAccessStream(リアルタイムで生成されたデータを返します)。ReadAsyncストリームは実際には書き込み可能またはシーク可能である必要はありませんが、メソッド(実際にはの一部)で自分のデータを返したいと思いIInputStreamます。

public IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
{
    throw new NotImplementedException("To be done");
}

私の2つの主な質問は次のとおりです。

  1. 実装するものを返すにはどうすればよいIAsyncOperationWithProgressですか?これを支援するためにフレームワークに組み込まれているものはありますか?
  2. バッファにデータを書き込むにはどうすればよいですか?とプロパティIBufferのみがあります(具象Bufferクラスはこれ以上提供しません)。LengthCapacity
4

2 に答える 2

4

バイト配列を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, 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);
     }
}
于 2012-12-05T13:59:24.627 に答える
2
  1. メソッドを使用AsyncInfo.Run(Func<CancellationToken, IProgress<uint>, Task<IBuffer>>)して、デリゲートからIAsyncOperationWithProgressインスタンスを作成します。

    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. 通常、バッファデータに直接アクセスする必要はありません。ただし、c#でこれを行う必要がある場合は、System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensionsクラスを使用して、バッファーとの間でデータをコピーできます。

于 2012-12-05T20:06:59.390 に答える