【C#】62. 非同步讀寫檔案的幾種方法: Task.Factory.FromAsync,WriteAsync

來源:互聯網
上載者:User

一、這裡主要說明2種非同步寫入檔案的方法:

1)非同步編程模型API轉為Task——使用Task.Factory.FromAsync方法

2)對於StreamWriter使用WriteAsync方法

請記得對stream對象使用FileOptions.Asynchronous選項。


首先來看一下準備函數:

CreateFileContent是用來隨機產生要寫入的內容(字串形式);

SumFileContent

static string CreateFileContent(){var sb = new StringBuilder();for (int i = 0; i < 100000; i++){sb.AppendFormat("{0}", new Random(i).Next(0, 99999));sb.AppendLine();}return sb.ToString();}async static Task<long> SumFileContent(string fileName){using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read,FileShare.None, BUFFER_SIZE, FileOptions.Asynchronous))using (var sr = new StreamReader(stream)){long sum = 0;while (sr.Peek() > -1){string line = await sr.ReadLineAsync();sum += long.Parse(line);}return sum;}}static Task SimulateAsynchronousDelete(string fileName){return Task.Run(() => File.Delete(fileName));}

1)Task.Factory.FromAsync方法

using (var stream = new FileStream("test2.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None, BUFFER_SIZE, FileOptions.Asynchronous)){Console.WriteLine("2. Uses I/O Threads: {0}", stream.IsAsync);byte[] buffer = Encoding.UTF8.GetBytes(CreateFileContent());var writeTask = Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, buffer, 0, buffer.Length, null);           await writeTask;}

2)StreamWriter.WriteAsync方法

using (var stream = File.Create("test3.txt", BUFFER_SIZE, FileOptions.Asynchronous))using (var sw = new StreamWriter(stream)){Console.WriteLine("3. Uses I/O Threads: {0}", stream.IsAsync);await sw.WriteAsync(CreateFileContent());}


二、非同步從檔案中讀取內容(四個Task來數字數,WhenAll後再相加)

Console.WriteLine("Starting parsing files in parallel");Task<long>[] readTasks = new Task<long>[4];for (int i = 0; i < 4; i++){readTasks[i] = SumFileContent(string.Format("test{0}.txt", i + 1));}long[] sums = await Task.WhenAll(readTasks);Console.WriteLine("Sum in all files: {0}", sums.Sum());


三、類比非同步刪除(因為API中沒有非同步刪除)

Console.WriteLine("Deleting files...");Task[] deleteTasks = new Task[4];for (int i = 0; i < 4; i++){string fileName = string.Format("test{0}.txt", i + 1);deleteTasks[i] = SimulateAsynchronousDelete(fileName);}await Task.WhenAll(deleteTasks);Console.WriteLine("Deleting complete.");




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.