C# 异步编程

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;
        }
原文地址:https://www.cnblogs.com/gmcn/p/5830494.html