设为首页 加入收藏

TOP

TaskCreationOptions.LongRunning 运行比可用线程数更多的任务(三)
2019-09-17 19:08:25 】 浏览:103
Tags:TaskCreationOptions.LongRunning 运行 可用 线程 更多 任务
rtThreads},最大可用异步 I/O 线程数目为{MaxCompletionPortThreads}
"); Console.WriteLine(@"设置线程池中辅助线程的最大数目为{0}, 线程池中异步 I/O 线程的最大数目为{1} 同时运行30个长时运行线程,每个线程中运行一个同步方法,看是否30个线程是否都能运行。", MaxWorkerThreads, MaxCompletionPortThreads); ThreadPool.SetMaxThreads(10, 10); ThreadPool.GetMaxThreads(out MaxWorkerThreads, out MaxCompletionPortThreads); Console.WriteLine($"最大可用辅助线程数目为{MaxCompletionPortThreads},最大可用异步 I/O 线程数目为{MaxCompletionPortThreads}"); int count = 0; while (count++ < 30) { Task.Factory.StartNew(p => { int index = (int)p; int runCount = 0; LongRunningTask($"线程{index}", runCount, cts.Token); }, count, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); } Task.Delay(TimeSpan.FromSeconds(10)).Wait(TimeSpan.FromSeconds(20)); // 等待没有超时,等待任务有执行 cts.Cancel(); } 测试代码

测试结果:

测试用了10秒完成

主线程创建了一个等待10秒后完成的任务,任务等待超时20秒

说明主程序创建的任务立即执行了,程序等待了10秒完成。

 使用TaskCreationOptions.LongRunning  需要注意的是Action必须是同步方法同时运行任务书才能超出可以用线程数量,否则不能。

例如:

        /// <summary>
        /// 测试长时运行任务
        /// 只运行了前9个任务
        /// </summary>
        [TestMethod]
        public void TestTaskLongRunning2()
        {
            var cts = new CancellationTokenSource();
            int MaxWorkerThreads = 0, MaxCompletionPortThreads = 0;
            ThreadPool.GetMaxThreads(out MaxWorkerThreads, out MaxCompletionPortThreads);
            Console.WriteLine($"最大可用辅助线程数目为{MaxCompletionPortThreads},最大可用异步 I/O 线程数目为{MaxCompletionPortThreads}");

            MaxWorkerThreads = 10;
            MaxCompletionPortThreads = 10;
            Console.WriteLine(@"设置线程池中辅助线程的最大数目为{0}, 线程池中异步 I/O 线程的最大数目为{1}
同时运行30个长时运行线程,每个线程中运行一个异步方法,看是否30个线程是否都能运行。", MaxWorkerThreads, MaxCompletionPortThreads);
            ThreadPool.SetMaxThreads(10, 10);
            ThreadPool.GetMaxThreads(out MaxWorkerThreads, out MaxCompletionPortThreads);
            Console.WriteLine($"最大可用辅助线程数目为{MaxCompletionPortThreads},最大可用异步 I/O 线程数目为{MaxCompletionPortThreads}");
            
            int count = 0;
            while (count++ < 30)
            {

                Task.Factory.StartNew(async p =>
                {
                    int index = (int)p;
                    int runCount = 0;
                    await LongRunningTaskAsync($"线程{index}", runCount, cts.Token);
                }, count, cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
            }

            Task.Delay(TimeSpan.FromSeconds(10)).Wait(TimeSpan.FromSeconds(20));    // 等待没有超时,等待任务有执行
            cts.Cancel();
        }
        /// <summary>
        /// 异步长时运行任务
        /// </summary>
        /// <param name="taskName">任务名称</param>
        /// <param name="runCount">运行次数</param>
        /// <param name="token">传播有关取消操作的通知</param>
        /// <returns></returns>
        private async Task LongRunningTaskAsync(string taskName, int runCount, CancellationToken token)
        {
            await PrintTask($"任务【{taskName}】线程ID【{Environment.CurrentManagedThreadId}】第【{++runCount}】次运行");
            if (!token.IsCancellationRequested)
                await LongRunningTaskAsync(taskName, runCount, token);
        }
测试代码

 

测试结果

测试用了10秒完成

主线程创建了一个等待10秒后完成的任务,任务等待超时20秒

说明主程序创建的任务立即执行了,程序等待了10秒完成。

WebSocket修改后的监听方法:

        /// <summary>
        /// 监听端口 创建WebSocket
        /// </summary>
        /// <param name="httpListener"></param>
        private void Creat
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇.net core入门-发布及部署_异常(.. 下一篇9.10 翻译系列:EF数据注解特性之..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目