我有一段代碼以異步方式寫入記憶體流(.NET Standard 2.1)
- 創建一個熱點任務串列,每行一個
- 然后等待它們全部完成
- 最后將 writer 緩沖區重繪 到 memoryStream
代碼:
await using var memoryStream = new MemoryStream();
await using var writer = new StreamWriter(memoryStream);
var recordTasks = stringRecordsToWrite.Select(r => writer.WriteLineAsync(r));
await Task.WhenAll(recordTasks);
await writer.FlushAsync();
var result = memoryStream.ToArray();
問題
有幾個問題困擾著我:
- 有報道稱,有時會跳過一些記錄。因此,我想知道,這種實施是否是根本原因。我試圖在本地重現該問題,但不幸的是,沒有成功
- Resharper 還強調,'writer'(在 SELECT 陳述句中)是一個捕獲的變數,并位于外部范圍內。會不會有問題?
或者那些是錯誤的痕跡,并且執行良好,我應該嘗試在其他地方找到原因
uj5u.com熱心網友回復:
你有一個流。并行異步寫入它并沒有真正意義——任何數量的事情都可能出錯。我什至不知道MemoryStream執行緒安全是什么樣的,我也看不到任何關于它的檔案。檔案StreamWriter明確指出:
默認情況下,StreamWriter 不是執行緒安全的。有關執行緒安全的包裝器,請參閱 TextWriter.Synchronized。
我強烈建議您按順序迭代,例如
foreach (var item in stringRecordsToWrite)
{
await writer.WriteLineAsync(item);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526718.html
標籤:C#异步异步等待流作家
