0%

C#的异步方法

异步方法介绍

大多数编程语言都支持多进程、多线程编程,在Win窗体应用开发中,使用多线程开发可以大大提高程序性能,避免出现卡顿,C#中定义多线程略微有一些繁琐。在某个情况下,只是为某个简单方法定义一个线程有些浪费,这时就可以使用C#中的异步方法,让程序运行到这里时,自动定义一个线程去执行异步方法,程序员不需要为此多花费精力。异步方法在完成其工作之前即返回到调用该方法的地方,主进程可以继续执行,不需要等待异步方法执行完成。

定义一个异步方法

在C#中自定义异步方法,最简单的情况就是使用Task.Run()配合lambda表达式。定义异步方法时,其方法头需要用async标识出,并且在方法体中包含一个或多个await表达式,async告诉编译器该方法是异步方法,await表达式告诉编译器该行为异步完成的任务,异步方法的返回值必为三种返回类型:void、Task和Task,异步方法的参数可以是除out和ref外的任意类型,同时按约定,异步方法名末尾应该以Async结尾。

1
2
3
4
5
6
7
8
9
10
11
async void PrintDelayAsync(string str)
{
await Task.Run(() => PrintDelay(str));
}

private void PrintDelay(string str)
{
Thread.Sleep(3000);
Console.WriteLine("{0} in async method after 3 seconds.", str);
}
}

上述代码定义了名为PrintDelayAsync(string str)的方法,方法体中包含await表达式,调用了Task.Run()方法,并使用lambda表达式作为Task.Run()的参数,调用该异步方法,线程会停止3秒,然后在控制台输出一段文字。


1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
{
Program pp = new Program();
pp.PrintDelayAsync("Hello");
int n = 1;
while (n <= 10)
{
Console.WriteLine("{0} Hello in main thread.", n);
n++;
Thread.Sleep(500);
}
}

上述主程序将pp对象声明为Program类并初始化,进而可以通过调用Program中的异步方法,不会阻塞主程序执行。执行结果如图所示:
执行结果

总结

当某个方法存在阻塞程序执行的可能时,可以新定义一个线程或者使用异步方法;由于线程的创建和终值会消耗许多系统资源,因此在处理简单的耗时任务时,可以使用异步方法代替;异步方法体执行完成前就可以返回至调用方法,当然两者各有各的优势,应分情况使用。