for (int i = 0; i < 5; i++)
{               
     a(i);
}
我想在循环中调用一个函数,如何实现0-4,五个函数的异步调用?有什么好的方法吗?高手指教。

解决方案 »

  1.   

    ThreadPool.QueueWorkItem(a, i)不知道方法名字写没写对
      

  2.   


    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                System.Threading.Thread NewTh;
                for (int i = 0; i < 5; i++)
                {
                    NewTh = new System.Threading.Thread(new System.Threading.ThreadStart(Test));
                    NewTh.Start();
                }
            }
        }    private void Test()
        {
            Response.Write(DateTime.Now.ToString() + "<br >");
        }
      

  3.   


    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                System.Threading.Thread NewTh;
                for (int i = 0; i < 5; i++)
                {
                    NewTh = new System.Threading.Thread(new System.Threading.ThreadStart(Test));
                    NewTh.Start();
                }
            }
        }    private void Test()
        {
            System.Threading.Thread.Sleep(5000);
            
        }
      

  4.   


    近期项目不是很紧张,就抽空看了下线程方面的书,下面是自己写的一些读书笔记,也算是自己在博客园收集资料的一个开始吧。 
        线程操作主要用到Thread类,他是定义在System.Threading.dll下。使用时需要添加这一个引用。该类提供给我们四个重载的构造函数(以下引自msdn)。 Thread (ParameterizedThreadStart)  初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。  
    Thread (ThreadStart)  初始化 Thread 类的新实例。 
    由 .NET Compact Framework 支持。 Thread (ParameterizedThreadStart, Int32)  初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托,并指定线程的最大堆栈大小。  
    Thread (ThreadStart, Int32)  初始化 Thread 类的新实例,指定线程的最大堆栈大小。 
    由 .NET Compact Framework 支持。 
        我们如果定义不带参数的线程,可以用ThreadStart,带一个参数的用ParameterizedThreadStart。带多个参数的用另外的方法,下面逐一讲述。 一、不带参数的 using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Threading; namespace AAAAAA 

        class AAA 
        { 
            public static void Main() 
            { 
                Thread t = new Thread(new ThreadStart(A)); 
                t.Start();             Console.Read(); 
            }         private static void A() 
            { 
                Console.WriteLine("Method A!"); 
            } 
        } 

          结果显示Method A! 二、带一个参数的     由于ParameterizedThreadStart要求参数类型必须为object,所以定义的方法B形参类型必须为object。 using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Threading; namespace AAAAAA 

        class AAA 
        { 
            public static void Main() 
            {        
                Thread t = new Thread(new ParameterizedThreadStart(B)); 
                t.Start("B");             Console.Read(); 
            }         private static void B(object obj) 
            { 
                Console.WriteLine("Method {0}!",obj.ToString ());         } 
        } 

    结果显示Method B! 三、带多个参数的     由于Thread默认只提供了这两种构造函数,如果需要传递多个参数,我们可以自己将参数作为类的属性。定义类的对象时候实例化这个属性,然后进行操作。 using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Threading; namespace AAAAAA 

        class AAA 
        { 
            public static void Main() 
            { 
                My m = new My(); 
                m.x = 2; 
                m.y = 3;             Thread t = new Thread(new ThreadStart(m.C)); 
                t.Start();             Console.Read(); 
            } 
        }     class My 
        { 
            public int x, y;         public void C() 
            { 
                Console.WriteLine("x={0},y={1}", this.x, this.y); 
            } 
        } 

        结果显示x=2,y=3 四、利用结构体给参数传值。 定义公用的public struct,里面可以定义自己需要的参数,然后在需要添加线程的时候,可以定义结构体的实例。 //结构体 
      struct RowCol 
        { 
            public int row; 
            public int col; 
        }; //定义方法 
    public void Output(Object rc) 
            { 
                RowCol rowCol = (RowCol)rc; 
                for (int i = 0; i < rowCol.row; i++) 
                { 
                    for (int j = 0; j < rowCol.col; j++) 
                        Console.Write("{0} ", _char); 
                    Console.Write("\n"); 
                } 
            }
      

  5.   

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                System.Threading.Thread NewTh;
                for (int i = 0; i < 5; i++)
                {
                    NewTh = new System.Threading.Thread(Test);
                    NewTh.Start(i);
                    
                }
            }
        }    private void Test(object value)
        {
            System.Threading.Thread.Sleep(5000);
            
        }
      

  6.   

    如果不是你写的,记得把原址贴上 ~ 带参数线程的操作
    http://www.cnblogs.com/llsen/archive/2009/02/19/1394181.html
      

  7.   

    那篇文章的回复里 有很优雅的写法,匿名委托 
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                System.Threading.Thread NewTh;
                for (int i = 0; i < 5; i++)
                {
                    NewTh = new System.Threading.Thread(Test);
                    NewTh.Start(i);
                    NewTh = new System.Threading.Thread(delegate() { Test("Sandy", i.ToString()); });
                    NewTh.Start();
                    
                }
            }
        }    private void Test(object value)
        {
            System.Threading.Thread.Sleep(5000);
            
        }
        private void Test(string name, string pwd)
        {
            System.Threading.Thread.Sleep(3000);
        }
      

  8.   

    用异步或多线程如有对主线程的操作要用control.invoke()封送回UI线程