1. await
例如有一个静态方法 m , 要在程序中异步调用这个方法, 就在此方法前加关键字 await , 那么当程序运行到这条语句时, 会立即返回包含这条语句的方法, 并异步执行 m 方法,这样ui线程就不会被占用, 然后当 m 方法执行结束后会再次返回这条语句继续往下执行.
2. async
包含 await 关键字的方法必须添加 async 修饰符, 此方法的返回类型可以为 Task、 Task<TResult>或 void. 方法不能声明任何 ref 或 out 参数, 但是可以调用具有这类参数的方法.
3. 异步方法
能加 await 关键字的方法与一般方法不同,
没有返回值的异步方法使用 Task类型作为返回类型,
有返回值的方法使用 Task<TResult>作为返回类型, TResult为返回值的类型, (void返回类型只能用在事件方法中),
异步方法一般使用 Task.Run(Action) 来创建线程.
例: 需要返回值的异步方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Security.Cryptography; namespace Crypto { class Hash { //需要返回值的异步方法使用Task作为方法的返回值类型 public static Task<string> GetSHA1Async(string fileName) { //使用Task.Run(Action)创建线程池线程 return Task.Run(() => { string sha1str = ""; if (File.Exists(fileName)) { FileStream file = new FileStream(fileName, FileMode.Open); byte[] sha1 = SHA1.Create().ComputeHash(file); //计算文件的sha1 file.Close(); //先用BitConverter将sha1字节数组转换为16进制表示的字符串,默认每个字节用"-"分割 //再将字符串中的分隔符"-"去掉(替换为空字符串"") sha1str = BitConverter.ToString(sha1).Replace("-", ""); } return sha1str; }); } } } //在一个按钮控件的click事件中调用此异步方法 private async void buttonSHA1JiShuan_Click(object sender, RoutedEventArgs e) { textboxSHA1JiShuan.Text = ""; groupboxSHA1.IsEnabled = false; string sha1 = await Crypto.Hash.GetSHA1Async(textboxFileName.Text); textboxSHA1JiShuan.Text = sha1; groupboxSHA1.IsEnabled = true; }