学编程,来源栈;先学习,再交钱
当前系列: 垃圾桶 修改讲义

封装

我们要把上面这个Task封装成方法,怎么办?

最重要的一点,这个方法要能返回生成的random,后面的代码要用!

    public static Task<int> getRandom()
    {
        return Task<int>.Run(() =>
        {
            Thread.Sleep(500);    //模拟耗时
            return new Random().Next();
        });
    }

@想一想@:应该如何调用这个方法?(提示:不要直接getRandom().Result


假如我们还需要进一步的封装,添加一个方法Process,里面调用getRandom()并把其结果输出:

    public static void Process()
    {
        Task<int> task = getRandom();
        Console.WriteLine(task.Result);
    }

故技重施,好像不行了,这次……

@想一想@:再让Process()返回Task行不行?一个Task套另一Task会出现什么情况?

在getRandom()和Process()中展示线程Id看一看:

    Console.WriteLine("in getRandom() with Thread-" + Thread.CurrentThread.ManagedThreadId);


在.NET core的I/O类库中,我们会发现这样的方法:

    public static Task AppendAllLinesAsync(string path, IEnumerable<string> contents, Encoding encoding, CancellationToken cancellationToken = default); 
    public static Task<byte[]> ReadAllBytesAsync(string path, CancellationToken cancellationToken = default);


注意:

  • 方法名被添加了Async后缀(推荐命名规范
  • 方法的返回类型为Task或Task<T>







并行Linq Parallel LINQ (PLINQ)


仅适用于Linq to Object,主要的措施是:对数据源进行分区,然后多核并发运行(保守模式:如果能不并发就不并发)

核心方法:AsParallel(),在数据源后添加。

            try
            {
                IEnumerable<int> numbers = Enumerable.Range(0, 1000);
                var filtered = numbers.AsParallel()
                    //.Where(n => n % 11 == 0)
                    .Where(n => 8 % (n > 100 ? n : 0) == 0)
                    ;

                filtered.ForAll(f => Console.WriteLine(f));
            }
            catch (AggregateException ae)
            {
                ae.Handle(e =>
                {
                    Console.WriteLine(e);
                    return true;
                });
            }

ForAll():同样可以并发执行

仍然是AggregateException异常


学习笔记
源栈学历
今天学习不努力,明天努力找工作

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 垃圾桶 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码