热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C#】62.异步读写文件的几种方法:Task.Factory.FromAsync,WriteAsync

一、这里主要说明2种异步写入文件的方法:1)异步编程模型API转为Task——使用Task.Factory.FromAsync方法2)对于StreamWriter使用WriteAs

一、这里主要说明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.");  


【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync


推荐阅读
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
author-avatar
liuc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有