2016-04-28 6 views
5

私が正しくTaskであることmemoryStreamを配置する方法は以下の方法メモリストリームをタスクにどのように配置するのですか?

public void Write() { 
    var tasks = new List<Task>(); 
    while(...) { 
     var memoryStream = new MemoryStream(...); 
     var task = _pageBlob.WritePagesAsync(memoryStream, ...); 
     tasks.Add(task); 
    }  
    Task.WaitAll(tasks.ToArray()); 
} 

がありますか?タスクが終了したらmemoryStreamオブジェクトを処分する必要があります。

+3

MemoryStreamを処分する必要はありませんが、問題はまだ有効です。コード品質が「使用する」に入れるのは良いことです。 – usr

+0

私はそれを 'using'に入れることができますか?ループの後に 'Task.WaitAll(tasks.ToArray());'を実行する必要があります – Anatoly

+0

答えの1つのコードに 'using'を追加してください。彼らは最初にそれを使用していたはずですが、たぶん彼らは気にしませんでした。 – usr

答えて

2

Spl

private async Task WriteAsync(...) 
{ 
    using (var memoryStream = new MemoryStream(...)) 
    { 
    await _pageBlob.WritePagesAsync(memoryStream, ...); 
    } 
} 

次に、あなたの新しいメソッドを使用します:別のasyncメソッドにそれて、あなたのwhileループ本体はサイドノートでは

public void Write() { 
    var tasks = new List<Task>(); 
    while(...) { 
    tasks.Add(WriteAsync(...)); 
    }  
    Task.WaitAll(tasks.ToArray()); 
} 

を、非同期コード(Task.WaitAll)に遮断することは一般的に良いアイデアではありません。より自然なアプローチは、非同期にすることです。

public async Task WriteAsync() { 
    var tasks = new List<Task>(); 
    while(...) { 
    tasks.Add(WriteAsync(...)); 
    }  
    await Task.WhenAll(tasks); 
} 
+2

ええ、これは最もクリーンな方法です。他の何かをする理由はありません。 – usr

+0

ストリームを処分するときは? – Anatoly

+0

@Anatoly:ストリームは 'using'ブロックの最後に配置されます。 –

3

あなたは2つのオプションがあります。

タスク内のすべてのプロセスを1-カプセル化:

while(...) { 

    var task = Task.Run(async() => { 

     var memoryStream = new MemoryStream(...); 
     var res = await _pageBlob.WritePagesAsync(memoryStream, ...); 
     memoryStream.Dispose(); 

    }); 

    tasks.Add(task); 
}  

2-使用継続:

while(...) { 
    var memoryStream = new MemoryStream(...); 
    var task = _pageBlob.WritePagesAsync(memoryStream, ...) 
       .ContinueWith((PrevTask) => memoryStream.Dispose()); 

    tasks.Add(task); 
}  
+0

さて、これを実行するにはもっとたくさんの方法があります(例では、外部リストを使用して、WaitAllの後にdistramを保持して処分します)が、Asyncフレームワークを使用する2つの方法があります。 – Gusman

+0

タスクが終了したら 'memoryStream'オブジェクトを破棄する必要があります。 私は 'async/await'キーワードを持ちたくありません。どのように継続を追加し、その中にストリームを処分するのですか? – Anatoly

+0

は2番目のコードを使用しています。 – Gusman

0

私はこのような何かをするだろうし。

public void Write() 
{ 
    var tasks = new List<Task>(); 
    while (...) 
    { 
     var memoryStream = new MemoryStream(...); 
     var task = WritePagesAsync(memoryStream, ...); 
     tasks.Add(task); 
    } 
    Task.WaitAll(tasks.ToArray()); 
} 

private async Task WritePagesAsync(MemoryStream memoryStrem, ...) 
{ 
    await _pageBlob.WritePagesAsync(memoryStrem); 
    memoryStrem.Dispose(); 
} 
関連する問題