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