我们要把上面这个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);
注意:
并行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异常
多快好省!前端后端,线上线下,名师精讲
更多了解 加: