急!!!多线程调用同一个函数 我有一个线程数组 有8个成员 他们都要访问同一个函数。 我现在希望它们可以按顺序一个一个的调用这个函数 怎么办呢? 是用线程池 还是线程对列呢??有没有代码可供参考呢 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以用WAITONE();这个方法的.思路是这样的.等待一个完成的信号.然后下一个再启动. 线程互斥的问题,用线程锁解决。waitone可以具体参考http://hi.baidu.com/lecherline/blog/item/c429051f8eec42c9a78669eb.html文中有使用代码 有没有C#描述的具体代码呢??楼少给的代码是 VC的 给你一个 多线程调度例子;摘录:《程序员秘书》--线程--调度线程编程其它很简单,详见:http://www.psec.net.cn1、在 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,结束trueprivate 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、编译 C# 里面求余数函数 读取MPP文件 写入TXT内容对齐问题 将一个集合绑定到dataGridView上出现了问题 关于事件邦定与触发的问题!~ MSMQ怎样用啊? 求助:textBox绑定数据源后,改变BindingManageBase的position值,但textBox的值未变 知道和不知道 MaxtoCode 的朋友都进来看一下 (.NET源码的保护伞) 窗体焦点变化时触发哪个事件? 关于登录对话框和主窗口显示问题。 !!!哈希简单问题~~~马上揭贴~~~~~~~~~~~~~ 怎么改变vs2005文件夹的默认位置(包括.net的文件夹)
思路是这样的.等待一个完成的信号.然后下一个再启动.
具体参考
http://hi.baidu.com/lecherline/blog/item/c429051f8eec42c9a78669eb.html
文中有使用代码
摘录:《程序员秘书》--线程--调度线程
编程其它很简单,详见: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、编译