异步编程1

刺骨的言语ヽ痛彻心扉 2024-03-30 11:04 94阅读 0赞

一.什么是异步

  启动程序时,系统会在内存中创建一个新的进程。进程是构成运行程序的资源的集合。这些资源包括虚地址空间、文件句柄和许多其他程序运行所需的东西。

 在进程内部,系统创建了一个称为线程的内核(kernel)对象,它代表了真正执行的程序。(线程是“执行线程”的简称。)一旦进程建立,系统会在Nain方法的第一行语句处就开始线程的执行

在异步程序中,程序代码不需要按照编写时的顺序严格执行。有时需要在一个新的线程中运行一部分代码,有时无需创建新的线程,但为了更好地利用单个线程的能力,需要改变代码的执行顺序

  • 在C#5.0中引入的一个用来构建异步方法的新特性——async/await
  • .NET框架的特性——BackgroundWorker类 和 .NET任务并行库(没有嵌入C#中)

C#关键字:async、await、

async、await不等于多线程

1.异步方法:

“异步方法”:用async关键字修饰的方法

1)异步方法的返回值一般是Task,T是真正的返回值类型,Task。惯例: 异步方法名字以Async结尾。

2)即使方法没有返回值,也最好把返回值声明为非泛型的Task。

3)调用泛型方法时,一般在方法前加上await关键字,这样拿到的返回值就是泛型指定的T类型

4)异步方法的“传染性”:一个方法中如果有await调用,则这个方法也必须修饰为async

同步

  1. String filename = @"E:\a\1.txt";
  2. File.WriteAllText(filename, "hello");
  3. string s = File.ReadAllText(filename);
  4. Console.WriteLine(s);

运行结果

dab093254c764f99ac6cf4a2f6914967.png

bf524742281049b0843fbd56ca78750a.png

异步方法:

  1. string filename = @"E:\a\1.txt";
  2. await File.WriteAllTextAsync(filename, "hello 你好");
  3. string s = await File.ReadAllTextAsync(filename);
  4. Console.WriteLine(s);

结果是正常写入

还有一种比如写入量特别大的字符串就会出现异常

  1. string filename = @"E:\a\1.txt";
  2. StringBuilder sb = new StringBuilder();
  3. for(int i = 0; i < 100000; i++)
  4. {
  5. sb.AppendLine("hello");
  6. }
  7. File.WriteAllTextAsync(filename, sb.ToString());
  8. string s = await File.ReadAllTextAsync(filename);
  9. Console.WriteLine(s);

这种写入量特别大的字符串然后在读出来就会报异常

13d431c573a74376883319b2dcf587f6.png

The process cannot access the file ‘E:\a\1.txt’ because it is being used by another process.”

进程无法访问文件“E:\a\1.txt”,因为另一个进程正在使用该文件。“

说明写入是同步进程 下边的读取用await修饰是异步进程

一边正在写入还没有写入完毕 另一边就去读取了 就会出现异常

但是在3f525fb7486d4320b58de89f330caaff.png

位置加上await就不会出现异常

加上await 那么就会写入完毕才会就行读取

  1. string filename = @"E:\a\1.txt";
  2. StringBuilder sb = new StringBuilder();
  3. for(int i = 0; i < 100000; i++)
  4. {
  5. sb.AppendLine("hello");
  6. }
  7. await File.WriteAllTextAsync(filename, sb.ToString());
  8. string s = await File.ReadAllTextAsync(filename);
  9. Console.WriteLine(s);

结果

e52f13b1be3d445c844bc6c214ec0961.png

发表评论

表情:
评论列表 (有 0 条评论,94人围观)

还没有评论,来说两句吧...

相关阅读

    相关 异步编程

    及面试题:并发与并行的区别? 异步和这小节的知识点其实并不是一个概念,但是这两个名词确实是很多人都常会混淆的知识点。其实混淆的原因可能只是两个名词在中文上的相似,在英文...

    相关 异步编程

      如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则需要利用异步编程。     C\ 拥有语言级别的异步编程模型,它使你能轻松编写异步代码,而无需应付回叫...

    相关 异步编程1

    一.什么是异步   启动程序时,系统会在内存中创建一个新的进程。进程是构成运行程序的资源的集合。这些资源包括虚地址空间、文件句柄和许多其他程序运行所需的东西。  在进程

    相关 异步编程-Future

    Future可以说是在Dart异步编程中随处可见,比如一个网络请求返回的是Future对象,或者访问一个SharedPreferences返回一个Future对象等等。异步操作

    相关 java异步编程

        很多时候我们都希望能够最大的利用资源,比如在进行IO操作的时候尽可能的避免同步阻塞的等待,因为这会浪费CPU的资源。如果在有可读的数据的时候能够通知程序执行读操作甚至由

    相关 异步编程——promise

    异步编程——promise 定义 Promise是异步编程的一个解决方案,相比传统的解决方法——回调函数,使用Promise更为合理和强大,避免了回调函数之间的层层嵌套,...