多线程 线程池 最大线程数

anncesky 2018-08-18 09:10:01
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ThreadTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

for (int i = 0; i < 10; i++)
{
Thread.Sleep(1);
ThreadPool.QueueUserWorkItem(DoWork, i);
}
}
private void DoWork(object o)
{
Thread.Sleep(1000);
int id=Thread.CurrentThread.ManagedThreadId;
int userThread, ioThread;
ThreadPool.GetAvailableThreads(out userThread,out ioThread);
int userMaxThread, ioMaxThread;
ThreadPool.GetMaxThreads(out userMaxThread, out ioMaxThread);
this.Invoke(new Action(() => {
textBox1.Text = string.Format("{0}111i:{1} ID:{2} HashCode:{3} Aviad:{4} IO:{5}\r\n", textBox1.Text,
o.ToString(), id,
Thread.CurrentThread.GetHashCode(), userThread, userMaxThread);
textBox1.SelectionStart = textBox1.TextLength;
textBox1.ScrollToCaret();
}));

for (int k = 0; k < 10; k++)
{
ThreadPool.SetMaxThreads(10, 1);
ThreadPool.QueueUserWorkItem(DoWork2, k);
}
}

private void DoWork2(object o)
{
Thread.Sleep(100);
int id = Thread.CurrentThread.ManagedThreadId;
int userThread, ioThread;
ThreadPool.GetAvailableThreads(out userThread, out ioThread);
int userMaxThread, ioMaxThread;
ThreadPool.GetMaxThreads(out userMaxThread, out ioMaxThread);
this.Invoke(new Action(() =>
{
textBox1.Text = string.Format("{0}222i:{1} ID:{2} HashCode:{3} Aviad:{4} IO:{5}\r\n", textBox1.Text,
o.ToString(), id,
Thread.CurrentThread.GetHashCode(), userThread, userMaxThread);
textBox1.SelectionStart = textBox1.TextLength;
textBox1.ScrollToCaret();
}));
}

private void Form1_Load(object sender, EventArgs e)
{
ThreadPool.SetMaxThreads(10, 1);
}


}
}


在线程中启用线程,最大线程数无论怎么设置都无效果,都是1023,这是为什么哦,怎么处理?
...全文
337 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
anncesky 2018-08-18
  • 打赏
  • 举报
回复
我明白了。。。。
ThreadPool.SetMaxThreads(20, 20);
是这个方法的两个参数不一至的原因,我去,如果不一至就没有效果,那还设置两个参数干什么。。。。
anncesky 2018-08-18
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
线程启动多少、要不要延迟,这是系统线程池的核心决策功能。就算是这个参数是100万也不需要你改低了,人家自己会控制。这只是 max 参数,你何时见它真的同时分配1000多个线程了?


我看试了下我自己的WINFORM,多数情况并发启用的线程是5个左右,可能是我要处理的功能时间比较少,但是这个小功能数量非常大
,使用线程池并发的线程又只有5个左右,我想提高处理速度,自己新建线程,这样会不会快一些?
  • 打赏
  • 举报
回复
线程启动多少、要不要延迟,这是系统线程池的核心决策功能。就算是这个参数是100万也不需要你改低了,人家自己会控制。这只是 max 参数,你何时见它真的同时分配1000多个线程了?
anncesky 2018-08-18
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
32位系统是1000多,而64位系统默认60000多。你改它干什么?


我不想让线程启用过多,而让CPU率过高,而且.net 是提供ThreadPool.SetMaxThreads方法的,
为什么没有效果
  • 打赏
  • 举报
回复
32位系统是1000多,而64位系统默认60000多。你改它干什么?
  • 打赏
  • 举报
回复
另外要注意,能使用 BeginInvoke 的地方就不要使用阻塞的 Invoke。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧