8

並列に複数の非同期I/Oタスクを実行する必要があるが、X入出力プロセスが同時に実行されていないことを確認する必要がある場合はどうすればよいでしょうか。前後I/O処理タスクにこのような制限があってはなりません。並列に複数の非同期タスクを正しく実行する方法

ここにシナリオがあります.1000タスクがあるとします。それぞれが入力パラメータとしてテキスト文字列を受け取ります。そのテキストを変換し(プリI/O処理)、変換されたテキストをファイルに書き込みます。目標は、前処理ロジックでCPU /コアの100%を使用し、タスクのI/O部分を最大10度の並列処理(最大10回同時にファイルを書き込むために開く)を実行することです。

C#/ .NET 4.5でサンプルコードを提供することはできますか?

http://blogs.msdn.com/b/csharpfaq/archive/2012/01/23/using-async-for-file-access-alan-berman.aspx

+0

のRx 2.0(一度に10に第二段階を絞る)、このために良いフィットかもしれないが、私は十分に慣れていないんですよそれは確かに言うと。 : -/ –

答えて

7

これはTPLデータフローを使用するとよいでしょう。無制限の並列処理、制限された並列性を持つファイル書き込みブロックを作成してリンクします。

WriteToFile()は次のようになります
var unboundedParallelismOptions = 
    new ExecutionDataflowBlockOptions 
    { 
     MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded 
    }; 

var preProcessBlock = new TransformBlock<string, string>(
    s => PreProcess(s), unboundedParallelismOptions); 

var writeToFileBlock = new TransformBlock<string, string>(
    async s => 
      { 
       await WriteToFile(s); 
       return s; 
      }, 
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 }); 

var postProcessBlock = new ActionBlock<string>(
    s => PostProcess(s), unboundedParallelismOptions); 

var propagateCompletionOptions = 
    new DataflowLinkOptions { PropagateCompletion = true }; 

preProcessBlock.LinkTo(writeToFileBlock, propagateCompletionOptions); 
writeToFileBlock.LinkTo(postProcessBlock, propagateCompletionOptions); 

// use something like await preProcessBlock.SendAsync("text") here 

preProcessBlock.Complete(); 
await postProcessBlock.Completion; 

:ような何か

private static async Task WriteToFile(string s) 
{ 
    using (var writer = new StreamWriter(GetFileName())) 
     await writer.WriteAsync(s); 
} 
+0

+1興味深いです..ありがとう! –

+0

'PreProcess'と' PostProcess'メソッドは何ですか? – shashwat

+0

@shashwat彼らは必要なことをします。最初の質問は「I/O処理の前後の処理」について述べているので、メソッドを使って表現しました。 – svick

1

あなたは、タスクの開始へのアクセスを制御するためにDjikstraセマフォを検討したいと思うように聞こえます。

しかし、これは典型的なキュー/一定数のコンシューマの問題のように思えますが、それはより適切な方法で構いません。

関連する問題