static void Main(string[] args)
{
Random r = new Random();
for (int i = 0; i < 50; i++)
{
clstest c = new clstest();
add a1 = new add(c.addhandler);
a1.BeginInvoke(num1, num2, new AsyncCallback(c.addCallback), a1);
}
Console.Read();
}
代码很简单 a1是一个委托变量
c.addCallback是一个委托调用的方法 执行这个方法就显示当前线程id问题是循环50次以后 启动50个线程,
但循环速度很快就结束了, begininvoke的启动速度却非常的慢
几乎1秒启动一个 50个线程全部启动完毕估计要1分钟左右,有什么办法能增加启动速度嘛?
{
Random r = new Random();
for (int i = 0; i < 50; i++)
{
clstest c = new clstest();
add a1 = new add(c.addhandler);
a1.BeginInvoke(num1, num2, new AsyncCallback(c.addCallback), a1);
}
Console.Read();
}
代码很简单 a1是一个委托变量
c.addCallback是一个委托调用的方法 执行这个方法就显示当前线程id问题是循环50次以后 启动50个线程,
但循环速度很快就结束了, begininvoke的启动速度却非常的慢
几乎1秒启动一个 50个线程全部启动完毕估计要1分钟左右,有什么办法能增加启动速度嘛?
解决方案 »
- VS2008 如何设置输出路径从Release变回Debug
- qq,360这些软件的UI是用什么技术实现的?
- c#Socke:一个服务器只能对应一个客户端发数据,2个客户端无效,请问如何修改?
- 关于c#中 DataGridView 绑定后,去掉绑定每一个单元格数据类型问题
- web页面登录成功的同时把数据写入数据库,求高手帮助-----------
- 窗体资源释放问题
- xmldocument如何取子节点数据
- 关于C#的一个小问题
- C#如何打开一个PowerPoint空文件,并在幻灯片中插入图片和文字
- 求教一个关于DATAGRID控件的使用
- c# C/S 程序 能实现上传下载功能吗?
- c#怎么将winform设置为前置?
public int addhandler(int a, int b)
{
try
{ Console.WriteLine("1");
System.Threading.Thread.Sleep(1200000);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
return a + b;
}
按实际情况 "1"的打印间隔不会有明显延迟 实际有1秒不到的延迟
另外如果删除System.Threading.Thread.Sleep(1200000);这句 就明显没有延迟了
1200秒是20分钟了 我间隔不到1秒
异步应该是多个线程同时进行的 不存在一个线程执行完再执行下一个的
还有一点 我删掉Sleep这句后运行程序 是没有间隔的 但加上去以后 明显有1秒不到的间隔
Console.WriteLine("1");
System.Threading.Thread.Sleep(1200000);
打印语句是在sleep前的 只有先执行打印 再sleep
所以 无论是否sleep 所有线程打印"1"的间隔 应该是不会有延迟的
问题就在于 加入sleep语句后 就会有明显延迟
DotNet 里面所有的异步调用是利用线程池的,里面有个最大的线程数,然后线程池调度是需要时间的。而且时间不短。你可以设置ThreadPool里面的某个函数来改变 异步调用线程池最大的线程数。
我已经设置到500 否则剩余25个线程是无法启动的
问题是我删除sleep那句 就不会有延迟
楼主可以试下增加一下线程池中最小的工作线程数量试试。
System.Threading.ThreadPool.SetMinThreads(50, 1000);
Random r = new Random();
for (int i = 0; i < 50; i++)
{ clstest c = new clstest();
add a1 = new add(c.addhandler); a1.BeginInvoke(num1, num2, new AsyncCallback(c.addCallback), a1);
}
Console.Read();
希望大家帮忙解决下 谢谢
using System;
using System.Threading;
using System.Net;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace testConsole
{
delegate int add(int a, int b);
class clstest
{
public int addhandler(int a, int b)
{
Console.WriteLine("A");
System.Threading.Thread.Sleep(3000);// 注释代码后无延迟
return a + b;
} public void addCallback(IAsyncResult ia)
{
add a = (add)ia.AsyncState;
int result=a.EndInvoke(ia);
Console.WriteLine(result);
}
} class Program
{
static void Main(string[] args)
{
System.Threading.ThreadPool.SetMaxThreads(500, 500);
System.Threading.ThreadPool.SetMinThreads(500, 5000);
Random r = new Random();
for (int i = 0; i < 50; i++)
{
clstest c = new clstest();
int num1 = r.Next(1, 101);
int num2 = r.Next(1, 101);
add a1 = new add(c.addhandler);
a1.BeginInvoke(num1, num2, new AsyncCallback(c.addCallback), a1);
Console.WriteLine("已启动数量" + i);
}
Console.Read();
}
}
}
貌似是有点效果...可是"A"还是不能一次性全部打出 开始的打印速度快了点 刚我把最小值设到5000 返回false了
不知道在您的机器上是怎样的效果
加入50个线程同时开始运行以下两句代码(只有以下两句)运行完后 线程结束
Console.WriteLine("A");
System.Threading.Thread.Sleep(3000);// 注释代码后无延迟
那打印打印50次"A"应该是没有间隔的 但如果用委托就会存在明显间隔