17 异步与接口、yield

239 阅读1分钟

接口中的异步方法:

async是提示编译器为异步方法中的await代码进行分段处理的,而一个异步方法是否修饰了async对于方法的调用者来讲没区别的,因此对于接口中的方法或者抽象方法不能修饰为async。

class Program
    {
        static async Task Main(string[] args)
        {
            Tset tset = new Tset();
            Console.WriteLine(await tset.ReadCharCount(@"d:\文本文件\1.txt"));
        }

        interface ITest
        {
            Task<int> ReadCharCount(string file);
        }

        class Tset : ITest
        {
            public async Task<int> ReadCharCount(string file)
            {
                string s = await File.ReadAllTextAsync(file);

                return s.Length;
            }
        }
    }

异步与yield:

yield return不仅能够简化数据的返回,而且可以让数据处理“流水线化”,提升性能。

在旧版C#中,async方法中不能用yield。从C#8.0开始,把返回值声明为IAsyncEnumerable(不要带Task),然后遍历的时候用await foreach()即可。

yield打断点可以看到 返回一个 输出一个 再返回一个 再输出一个

class Program
    {
        static async Task Main(string[] args)
        {
            foreach (var item in test2())
            {
                Console.WriteLine(item);
            }

            await foreach (var item in test3())
            {
                Console.WriteLine(item);
            }
        }

        static IEnumerable<string> test1()
        {
            List<string> list = new List<string>();
            list.Add("1111");
            list.Add("2222");
            list.Add("3333");

            return list;
        }

        static IEnumerable<string> test2()
        {
            yield return "1111";
            yield return "2222";
            yield return "3333";
        }

        static async IAsyncEnumerable<string> test3()
        {
            yield return "1111";
            yield return "2222";
            yield return "3333";
        }
    }

ASP.NET Core和控制台项目中没有SynchronizationContext,因此不用管ConfigureAwait(false)等。 不要同步、异步混用。

版权声明:本文为CSDN博主「边城°」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/qq_42121121…