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分钟左右,有什么办法能增加启动速度嘛?

解决方案 »

  1.   

    给出委托的处理方法
    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);这句 就明显没有延迟了
      

  2.   

    回ls 
    1200秒是20分钟了 我间隔不到1秒 
    异步应该是多个线程同时进行的 不存在一个线程执行完再执行下一个的
    还有一点 我删掉Sleep这句后运行程序 是没有间隔的 但加上去以后 明显有1秒不到的间隔
      

  3.   

    再回楼上
    Console.WriteLine("1"); 
    System.Threading.Thread.Sleep(1200000); 
    打印语句是在sleep前的 只有先执行打印 再sleep 
    所以 无论是否sleep  所有线程打印"1"的间隔 应该是不会有延迟的 
    问题就在于 加入sleep语句后 就会有明显延迟
      

  4.   

    系统才不会蠢到建立50个线程呢。如果你的异步调用有100个,岂不是要有100个线程了?
    DotNet 里面所有的异步调用是利用线程池的,里面有个最大的线程数,然后线程池调度是需要时间的。而且时间不短。你可以设置ThreadPool里面的某个函数来改变 异步调用线程池最大的线程数。
      

  5.   

    回楼上 线程池最大25个 
    我已经设置到500 否则剩余25个线程是无法启动的
    问题是我删除sleep那句 就不会有延迟
      

  6.   

    的确是线程池的原因。
    楼主可以试下增加一下线程池中最小的工作线程数量试试。
               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();
      

  7.   

    回楼上 貌似还是无效果 给出所有代码 
    希望大家帮忙解决下 谢谢
    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();
    }
    }

    }
      

  8.   

    改成这样。//System.Threading.ThreadPool.SetMaxThreads(500, 500); //去掉这句System.Threading.ThreadPool.SetMinThreads(50, 1000);  //改成这样
      

  9.   

    谢谢楼上啊 
    貌似是有点效果...可是"A"还是不能一次性全部打出 开始的打印速度快了点 刚我把最小值设到5000 返回false了
    不知道在您的机器上是怎样的效果
      

  10.   

    问下ls 注释那句代码前后 打印"A"的效果都一样?是一次性很快的全部打出?
      

  11.   

    回ls
    加入50个线程同时开始运行以下两句代码(只有以下两句)运行完后 线程结束
    Console.WriteLine("A"); 
    System.Threading.Thread.Sleep(3000);// 注释代码后无延迟 
    那打印打印50次"A"应该是没有间隔的 但如果用委托就会存在明显间隔