zoukankan      html  css  js  c++  java
  • 【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync

    一、这里主要说明2种异步写入文件的方法:

    1)异步编程模型API转为Task——使用Task.Factory.FromAsync方法

    2)对于StreamWriter使用WriteAsync方法

    请记得对stream对象使用FileOptions.Asynchronous选项!

    首先来看一下准备函数:

    CreateFileContent是用来随机生成要写入的内容(字符串形式);

    SumFileContent

    [csharp] view plain copy
     
    1. static string CreateFileContent()  
    2. {  
    3. var sb = new StringBuilder();  
    4. for (int i = 0; i < 100000; i++)  
    5. {  
    6. sb.AppendFormat("{0}", new Random(i).Next(0, 99999));  
    7. sb.AppendLine();  
    8. }  
    9. return sb.ToString();  
    10. }  
    11.   
    12. async static Task<long> SumFileContent(string fileName)  
    13. {  
    14. using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read,FileShare.None, BUFFER_SIZE, FileOptions.Asynchronous))  
    15. using (var sr = new StreamReader(stream))  
    16. {  
    17. long sum = 0;  
    18. while (sr.Peek() > -1)  
    19. {  
    20. string line = await sr.ReadLineAsync();  
    21. sum += long.Parse(line);  
    22. }  
    23.   
    24. return sum;  
    25. }  
    26. }  
    27.   
    28. static Task SimulateAsynchronousDelete(string fileName)  
    29. {  
    30. return Task.Run(() => File.Delete(fileName));  
    31. }  


    1)Task.Factory.FromAsync方法

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


    2)StreamWriter.WriteAsync方法

    [csharp] view plain copy
     
    1. using (var stream = File.Create("test3.txt", BUFFER_SIZE, FileOptions.Asynchronous))  
    2. using (var sw = new StreamWriter(stream))  
    3. {  
    4. Console.WriteLine("3. Uses I/O Threads: {0}", stream.IsAsync);  
    5. await sw.WriteAsync(CreateFileContent());  
    6. }  

    二、异步从文件中读取内容(四个Task来数字数,WhenAll后再相加)

    [csharp] view plain copy
     
    1. Console.WriteLine("Starting parsing files in parallel");  
    2.   
    3. Task<long>[] readTasks = new Task<long>[4];  
    4. for (int i = 0; i < 4; i++)  
    5. {  
    6. readTasks[i] = SumFileContent(string.Format("test{0}.txt", i + 1));  
    7. }  
    8.   
    9. long[] sums = await Task.WhenAll(readTasks);  
    10.   
    11. Console.WriteLine("Sum in all files: {0}", sums.Sum());  

    三、模拟异步删除(因为API中没有异步删除)

    [csharp] view plain copy
     
    1. Console.WriteLine("Deleting files...");  
    2.   
    3. Task[] deleteTasks = new Task[4];  
    4. for (int i = 0; i < 4; i++)  
    5. {  
    6. string fileName = string.Format("test{0}.txt", i + 1);  
    7. deleteTasks[i] = SimulateAsynchronousDelete(fileName);  
    8. }  
    9.   
    10. await Task.WhenAll(deleteTasks);  
    11.   
    12. Console.WriteLine("Deleting complete.");  




  • 相关阅读:
    FreeMarker list指令(3.2)
    FreeMarker if指令(3.1)
    FreeMarker FTL常用指令(3)
    FreeMarker模板文件的组成(2)
    FreeMarker语言概述(1)
    动态执行--获取某数据库某表某些字段的唯一值
    Luogu P3403 跳楼机|同余最短路
    Luogu P1640 [SCOI2010]连续攻击游戏|二分图
    **** **** 黑白球|DP
    **** **** 建筑物|DP
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7851038.html
Copyright © 2011-2022 走看看