指定Task任务顺序执行

经常听到说线程池这个东西,凭印象写了个这么简单的例子。

 

CusTRun方法要不要await,取决于要不要作为后台任务。
任务可指定数量,线程参数可共享全,顺序可控,可继续改进。
复制代码
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {
        static AsyncLocal<int> asyncObj = new AsyncLocal<int>();
        static async Task Main(string[] args)
        {
            await CusTRun(100, async () =>
             {
                 //TODO:业务代码
                 await Task.Delay(1000);
                 Console.WriteLine(asyncObj.Value);
                 Console.WriteLine("ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId);
             }, default);
            Console.WriteLine("Hello World!");
            Console.ReadKey();
        }

        static async Task CusTRun(int count, Func<Task> func, CancellationToken cancellationToken)
        {
            ConcurrentDictionary<int, Task> taskDic = new ConcurrentDictionary<int, Task>();
            for (int i = 0; i < count; i++)
            {
                asyncObj.Value = i;
                if (taskDic.Values.Count(t => t.Status != TaskStatus.RanToCompletion) >= 5)
                {
                    taskDic = (ConcurrentDictionary<int, Task>)(taskDic.OrderBy(x => x.Key));
                    Task.WaitAny(taskDic.Values.ToArray());
                    taskDic.Values.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();
                }
                else
                {
                    taskDic.TryAdd(i, Task.Run(func, cancellationToken));
                }
                await Task.Delay(1000);
            }
        }
    }
}
复制代码

 

posted @   星仔007  阅读(340)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示