我有一个线程数组 有8个成员 他们都要访问同一个函数。 我现在希望它们可以按顺序一个一个的调用这个函数 怎么办呢? 是用线程池 还是线程对列呢??有没有代码可供参考呢 谢谢

解决方案 »

  1.   

    你可以用WAITONE();这个方法的.
    思路是这样的.等待一个完成的信号.然后下一个再启动.
      

  2.   

    线程互斥的问题,用线程锁解决。waitone可以
    具体参考
    http://hi.baidu.com/lecherline/blog/item/c429051f8eec42c9a78669eb.html
    文中有使用代码
      

  3.   

    有没有C#描述的具体代码呢??楼少给的代码是 VC的
      

  4.   

    给你一个 多线程调度例子;
    摘录:《程序员秘书》--线程--调度线程
    编程其它很简单,详见:http://www.psec.net.cn
    1、在 Microsoft Visual Studio .NET 的“文件”菜单上,单击“新建”,然后单击“项目”。 
    2、在“新建项目”对话框中,选择“Visual C#项目”,再选择“Windows 应用程序”模板。 
    3、键入 MutexThreads 作为该程序的名称,然后单击确定。
    4、在Form1.cs的视图设计器中,添加如下控件:
    控件类型     控件名称    控件属性      属性值
    Button       button1      Text          多线程调度演示
    RichTextBox  richTextBox1 
    5、在Form1.cs的代码设计器中,引用添加如下代码
    using System.Threading;
    6、在Form1.cs的视图设计器中,选中button1,在属性框中选中事件,双击Click,在Form1.cs的代码设计器中,添加修改如下代码
    private void button1_Click(object sender, EventArgs e)
    {
        richTextBox1.Text = "";
        button1.Enabled = false;
        Mutex1 = new Mutex(true);//Mutex对象(一个调度指令)
        Mutex2 = new Mutex(true);
        Mutex3 = new Mutex(true);
        Mutex4 = new Mutex(true);
        Mutex5 = new Mutex(true);
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "多线程调度例子");//主线程暂停时,更新进度信息
        Thread T1 = new Thread(new ThreadStart(Thread1));//定义4个线程
        Thread T2 = new Thread(new ThreadStart(Thread2));
        Thread T3 = new Thread(new ThreadStart(Thread3));
        Thread T4 = new Thread(new ThreadStart(Thread4));
        T1.Start();// 使用Mutex.WaitAll()方法等待一个Mutex数组(Mutex4和Mutex5)中的对象全部被释放
        T2.Start();// 使用Mutex.WaitOne()方法等待Mutex3的释放
        T3.Start();// 使用Mutex.WaitAny()方法等待一个Mutex数组中任意一个对象被释放
        T4.Start();// 使用WaitHandle.WaitAll等待所有线程结束
        Thread.Sleep(10);
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "分五个线程调度指令Mutex1--Mutex5");//主线程暂停时,更新进度信息
        Thread.Sleep(2000);
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex1");//主线程暂停时,更新进度信息
        Mutex1.ReleaseMutex(); //线程Thread3结束条件满足
        Thread.Sleep(2000);
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex3");//主线程暂停时,更新进度信息
        Mutex3.ReleaseMutex(); //线程Thread2结束条件满足
        Thread.Sleep(2000);
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex4");//主线程暂停时,更新进度信息
        Mutex4.ReleaseMutex();
        Thread.Sleep(2000);
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "主线程中释放Mutex5");//主线程暂停时,更新进度信息
        Mutex5.ReleaseMutex(); //线程Mutex1结束条件满足
        button1.Enabled = true;
    }
    7、在Form1.cs的代码设计器中,添加修改如下代码
    private static Mutex Mutex1, Mutex2, Mutex3, Mutex4,Mutex5;//创建Mutex对象(调度指令)
    private static AutoResetEvent Event1 = new AutoResetEvent(false);//线程结束信息灯,未结束false,结束true
    private static AutoResetEvent Event2 = new AutoResetEvent(false);
    private static AutoResetEvent Event3 = new AutoResetEvent(false);
    private AutoResetEvent[] EventS = new AutoResetEvent[] { Event1, Event2, Event3 };//线程组结束信息灯private delegate void ChangeString(string Txt);//这个代理能异步调用设置文本框(可以多参数)public void Thread1()
    {
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), new object[] { "线程Thread1启动,Mutex.WaitAll,等待Mutex4和Mutex5都释放信号" });//从VS2005开始,给主线程控件附值被认为是不安全的
        Mutex[] gMs = new Mutex[2];
        gMs[0] = Mutex4;//创建一个Mutex数组作为Mutex.WaitAll()方法的参数
        gMs[1] = Mutex5;
        Mutex.WaitAll(gMs);//等待Mutex1和Mutex2都被释放
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread1结束");//从VS2005开始,给主线程控件附值被认为是不安全的
        Event1.Set(); //线程结束,将Event1设置为有信号状态
    }public void Thread2()
    {
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread2启动,Mutex3.WaitOne,等待Mutex3释放信号");//从VS2005开始,给主线程控件附值被认为是不安全的
        Mutex3.WaitOne();//等待Mutex3被释放
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread2结束");//从VS2005开始,给主线程控件附值被认为是不安全的
        Event2.Set();//线程结束,将Event2设置为有信号状态
    }public void Thread3()
    {
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread3启动,Mutex.WaitAny,等待Mutex1和Mutex2中的一个释放信号");//从VS2005开始,给主线程控件附值被认为是不安全的
        Mutex[] gMs = new Mutex[2];
        gMs[0] = Mutex1;//创建一个Mutex数组作为Mutex.WaitAny()方法的参数
        gMs[1] = Mutex2;
        Mutex.WaitAny(gMs);//等待数组中任意一个Mutex对象被释放
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread3结束");//从VS2005开始,给主线程控件附值被认为是不安全的
        Event3.Set();//线程结束,将Event3设置为有信号状态
    }
    public void Thread4()
    {
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread4启动,WaitHandle.WaitAll,等待所有线程结束");//从VS2005开始,给主线程控件附值被认为是不安全的
        WaitHandle.WaitAll(EventS);
        richTextBox1.Invoke(new ChangeString(SetrichTextBox1Text), "线程Thread4结束,所有线程结束");//从VS2005开始,给主线程控件附值被认为是不安全的
    }
    private void SetrichTextBox1Text(string Txt)//此部分实际上是主线程调用的(可以多参数)
    {
        richTextBox1.Text += Txt + "\r\n";
        richTextBox1.Refresh();
    }
    8、编译