2017-11-20 8 views
-1

私は2つの異なるサードパーティのライブラリからの二つの方法があります:接続のwriteToストリームとReadFromストリーム方法

Task WriteToAsync(Stream stream); 
Task LoadAsync(Stream stream); 

を私はLoad方法にソースWriteTo方法からパイプデータにする必要があります。

現在、次の溶液が使用されます。

using (var stream = new MemoryStream()) { 
    await source.WriteToAsync(stream); 
    stream.Position = 0; 
    await destination.LoadAsync(stream); 
} 

は、任意のより良い方法はありますか?

+0

* everything *を 'MemoryStream'に同期して読み込み、どこかに書き込むと、' Stream'の 'async'実装が必要になります。あなたは1つを実装し、どの仮想メソッドをオーバーライドして、その間に大きなバッファを持たないようにするかを見ることができます。 – Sinatr

+0

@Sinatr、それは私が使用できる準備が整った実装があれば、私が求めていることです。 –

+0

私は1つを知りませんし、実装を推奨するのはここで話題にはなりません。代わりに特定の質問を求める/検索してみてください。ライブラリが普及している場合、誰かが同じ問題に遭遇している可能性があります。あなたは[ここ](https://stackoverflow.com/a/1540799/1997232)(「C#async stream」のグーグル)ですか? – Sinatr

答えて

1

以下のコードが示すように、パイプストリームを使用してデータをストリームすることができます。リーダーを起動するまで、ライターでawaitを使用しないでください。

class Program 
{ 
    static void Main(string[] args) 
    { 
     ReaderDemo rd = new ReaderDemo(); 
     GenPrimes(rd).ContinueWith((t) => { 
     if (t.IsFaulted) 
      Console.WriteLine(t.Exception.ToString()); 
     else 
      Console.WriteLine(rd.value); 
     }).Wait(); 
    } 

    static async Task GenPrimes(ReaderDemo rd) 
    { 
     using (var pout = new System.IO.Pipes.AnonymousPipeServerStream(System.IO.Pipes.PipeDirection.Out)) 
     using (var pin = new System.IO.Pipes.AnonymousPipeClientStream(System.IO.Pipes.PipeDirection.In, pout.ClientSafePipeHandle)) 
     { 
     var writeTask = WriterDemo.WriteTo(pout); 

     await rd.LoadFrom(pin); 
     await writeTask; 
     } 
    } 
} 

class ReaderDemo 
{ 
    public string value; 

    public Task LoadFrom(System.IO.Stream input) 
    { 
     return Task.Run(() => 
     { 
     using (var r = new System.IO.StreamReader(input)) 
     { 
      value = r.ReadToEnd(); 
     } 
     }); 
    } 
} 

class WriterDemo 
{ 
    public static Task WriteTo(System.IO.Stream output) 
    { 
     return Task.Run(() => { 
     using (var writer = new System.IO.StreamWriter(output)) 
     { 
      writer.WriteLine("2"); 
      for (int i = 3; i < 10000; i+=2) 
      { 
       int sqrt = ((int)Math.Sqrt(i)) + 1; 
       int factor; 
       for (factor = 3; factor <= sqrt; factor++) 
       { 
        if (i % factor == 0) 
        break; 
       } 
       if (factor > sqrt) 
       { 
        writer.WriteLine("{0}", i); 
       } 
      } 
     } 
     }); 
    } 
} 
関連する問題