【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync
来源:互联网 发布:java工程师待遇 编辑:程序博客网 时间:2024/05/22 06:40
一、这里主要说明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());
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.");
1 0
- 【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync
- Java读写文件的几种方法
- Java读写文件的几种方法
- Java读写文件的几种方法
- Matlab文件读写的几种方法
- Java读写文件的几种方法
- Java读写文件的几种方法
- Java读写文件的几种方法
- C#Task异步调用方法
- 文件的读写 几种常见的方法
- 实现文件读写操作的几种方法
- C++ 读写操作同一个文件的几种方法
- Java 中读写文件内容常见的几种方法
- Matlab实现文件读写的几种方法
- Linux shell文件读写的几种方法
- Matlab实现文件读写的几种方法
- C#.net 异步读写文件
- Python读写文件的方法,及其读写(IO)的几种模式,
- adb 的一些命令集合(用到了就添加)
- TOMCAT服务器重启造成图片资源自动删除
- Ubuntu环境配置
- centos7 安装jdk以及path设置
- 解决:dubbo配置文件报红叉的问题
- 【C#】62. 异步读写文件的几种方法: Task.Factory.FromAsync,WriteAsync
- ios10适配
- 请执行命令取出linux中eth0的IP地址
- Iptables工作原理使用详解
- Android工程的编译过程
- 3.8 Swift数组的遍历
- 【机器学习】监督和非监督学习
- 软件开发项目成本管理实践
- Linux操作练习 demo(待完善)