.Net异步编程之为什么有的异步方法没有async

有的时候,我们可能会发现有些异步方法没有关键字async,程序同样能够正常运行。
了解这个之前,我们需要知道async函数的缺点;

  • 异步方法是一个类(具体需要通过反编译工具看源代码),运行效率没有普通方法高。因为类的创建包含其他成员属性的声明,会消耗很多额外的资源。
  • 可能会占用非常多的线程。

了解到以后特点后,在某些情况下,我们可以省略掉async关键字。

    class Program
    {
        static async Task Main(string[] args)
        {
            string s = await ReadAsync(1);
            Console.WriteLine(s);
        }

        static Task<string> ReadAsync(int num)
        {
            if (num == 1)
            {
                return File.ReadAllTextAsync(@"D:\Test\1.txt");
            }
            else if (num == 1)
            {
                return File.ReadAllTextAsync(@"D:\Test\1.txt");
            }
            else
            {
               throw new ArgumentException();
            }
        }
    }

在上例中,ReadAsync()函数没有关键字async,同样没有问题。该函数体的File.ReadAllTextAsync()前省略了await关键字,函数同样没有async关键字。
此种情况只能应用于异步函数没有其他额外的业务逻辑时,只是简单的讲异步的返回值返回给调用者。

类似于下面这种:
.Net异步编程之为什么有的异步方法没有async

通过上图可以看出,如果增加了额外的业务逻辑,程序是会报错的。

.Net异步编程之为什么有的异步方法没有async

上一篇:css 让一行文字 字与字的隔开一点


下一篇:Java 窗体居中 通用代码