日期:2014-05-19  浏览次数:21162 次

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

------解决方案--------------------
给你一个 多线程调度例子;
摘录:《程序员秘书》--线程--调度线程
编程其它很简单,详见: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启动,