c#中异步与多线程的作用有哪些

  

c#中异步与多线程的作用有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

UI线程

还有一件重要的事情需要知道的是为什么使用这些工具是好的。在。net中,有一个主线程叫做UI线程,它负责更新屏幕的所有可视部分。默认情况下,这是一切运行的地方。当你点击一个按钮,你想看到按钮被短暂地按下,然后返回,这是UI线程的责任。你的应用中只有一个UI线程,这意味着如果你的UI线程忙着做繁重的计算或等待网络请求之类的事情,那么它不能更新你在屏幕上看到的东西,直到它完成。结果是,你的应用程序看起来像“冻结”——你可以点击一个按钮,但似乎什么都不会发生,因为UI线程正在忙着做其他事情。

理想情况下,你希望UI线程尽可能地空闲,这样你的应用程序似乎总是在响应用户的操作。这就是异步和多线程的由来。通过使用这些工具,可以确保在其他地方完成繁重的工作,UI线程保持良好和响应性。

现在让我们看看如何在c#中使用这些工具。

c#的异步操作

执行异步操作的代码非常简单。你应该知道两个主要的关键字:“异步”和“等待”,所以人们通常将其称为异步/等待。假设你现在有这样的代码:

public  void 糊涂()   {   var 才能;hugeFiles =, new  string [], {   ,才能“Gr8Gonzos_Home_Movie_In_8k_Res.mkv",,//1, GB   ,才能“War_And_Peace_In_150_Languages.rtf",,//, 1.2 GB   ,才能“Cats_On_Catnip.mpg",,,,,,,,,//, 0.9 GB   ,,};      foreach 才能;(var  hugeFile  hugeFiles拷贝)   {才能   ,,,ReadAHugeFile (hugeFile);   ,,}   ,,   MessageBox.Show才能(做得“All  !“);   }         public  byte [], ReadAHugeFile (string  bigFile)   {   var 才能;fileSize =, new  FileInfo (bigFile) . length;,//, Get 从而file 大小   var 才能;allData =, new 字节(文件大小),,,,,,,//,Allocate  a  byte  array  as  large  as  our 文件   using 才能;(var  fs =, new  System.IO.FileStream (bigFile, FileMode.Open))   {才能   ,,,fs.Read (allData, 0, (int)文件大小),,,,//,Read 从而entire 文件…   ,,}   return 才能;allData;,,,,,,,,,,,,,,,//,…以及return  those 字节!   }

在当前的形式中,这些都是同步运行的。如果你点击一个按钮从UI线程运行糊涂(),那么应用程序将似乎冻结,直到所有三大文件阅读,因为每个“ReadAHugeFile”是要花很长时间在UI线程上运行,并将同步阅读。这可不好!让我们看看能否将ReadAHugeFile变为异步的这样UI线程就能继续处理其他东西。

无论何时,只要有支持异步的命令,微软通常会给我们同步和异步版本的这些命令。在上面的代码中,System.IO.FileStream对象同时具有“Read"和“ReadAsync"方法,所以第一步就是将“fs.Read”修改成“fs。ReadAsync”。

public  byte [], ReadAHugeFile (string  bigFile)   {   var 才能;fileSize =, new  FileInfo (bigFile) . length;,//, Get 从而file 大小   var 才能;allData =, new 字节(文件大小),,,,,,,//,Allocate  a  byte  array  as  large  as  our 文件   using 才能;(var  fs =, new  System.IO.FileStream (bigFile, FileMode.Open))   {才能   ,,,fs.ReadAsync (allData, 0, (int)文件大小),,//,Read 从而entire  file 异步…   ,,}   return 才能;allData;,,,,,,,,,,,,,,,//,…以及return  those 字节!   }

如果现在运行它,它会立即返回,并且allData字节数组中不会有任何数据。为什么?

这是因为ReadAsync是开始读取并返回一个任务对象,这有点像一个书签。这是。net的一个“承诺”,一旦异步活动完成(例如从硬盘读取数据),它将返回结果,任务对象可以用来访问结果。但如果我们对这个任务不做任何事情,那么系统就会立即继续到下一行代码,也就是我们的“返回allData"行,它会返回一个尚未填满数据的数组。

因此,告诉代码等待结果是很有用的(但这样一来,原始线程可以在此期间继续做其他事情)。为了做到这一点,我们使用了一个“awaiter",它就像在异步调用之前添加单词“await"一样简单:

public  byte [], ReadAHugeFile (string  bigFile)   {   var 才能;fileSize =, new  FileInfo (bigFile) . length;,//, Get 从而file 大小   var 才能;allData =, new 字节(文件大小),,,,,,,//,Allocate  a  byte  array  as  large  as  our 文件   using 才能;(var  fs =, new  System.IO.FileStream (bigFile, FileMode.Open))   {才能   ,,,await  fs.ReadAsync (allData, 0, (int)文件大小),,//,Read 从而entire  file 异步…   ,,}   return 才能;allData;,,,,,,,,,,,,,,,//,…以及return  those 字节!   }

c#中异步与多线程的作用有哪些