2012-12-05 44 views
7

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

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

私の二つの主な質問は以下のとおりです。

  1. 私はIAsyncOperationWithProgressを実装して何かを返すにはどうしますか?これを手助けするためにフレームワークに何かが組み込まれていますか?
  2. バッファにデータを書き込むにはどうすればよいですか? IBufferLengthCapacityのプロパティしか持っていません(コンクリートのBufferクラスはこれ以上提供しません)。
+0

重複したhttp://stackoverflow.com/questions/10112696/how-to-implement-iasyncoperationwithprogress? –

+0

@RenéWolferink私はその質問を見ましたが、そこの答えは実際に私の問題に対処していません。 –

答えて

4

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, 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); 
    } 
} 
1
  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クラスを使用して、バッファとの間でデータをコピーすることができます。

+0

あなたはこれ以上説明できますか? – durron597

+0

私はより詳細で私の答えを更新しました。 –

+0

ありがとう、私の質問の最初の部分に答えるように見えます。でも、私はどのようにIBufferを埋めるのかわからない –

関連する問題