代码
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
// c#-Parallel-基础
namespace ConsoleApp25
{
class Program
{
static int forNum = 5;
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
ParalleFor();
ParalleForAsync();
}
static void Log(string prefix) => Console.WriteLine($"{prefix}task:{Task.CurrentId} Thread:{Thread.CurrentThread.ManagedThreadId}");
static void ParalleFor() {
ParallelLoopResult result = Parallel.For(0, forNum, i =>
{
Log($"s: {i}");
Task.Delay(10).Wait();
Log($"e: {i}");
});
Console.WriteLine($"is completed:{result.IsCompleted}");
}
// 1 Task.Delay后线程发生了变化
// 2 Task 延迟后 任务id没有了,只有线程
// 3 使用过的线程被重用了
// 4 for 没有等待延迟,而是直接执行
static void ParalleForAsync()
{
Log($"s ParalleForAsync:");
ParallelLoopResult result = Parallel.For(0, forNum, async i =>
{
Log($"s async:{i}");
await Task.Delay(10);
Log($"e async:{i}");
});
Console.WriteLine($"is completed:{result.IsCompleted}");
Log($"e ParalleForAsync:");
}
}
}
规律总结
// 1 Task.Delay后线程发生了变化
// 2 Task 延迟后 任务id没有了,只有线程
// 3 使用过的线程被重用了
// 4 for 没有等待延迟,而是直接执行