线程的挂起,停止 NET封装的 线程池类ThreadPool1,怎么挂起里面的 ‘正在执行的线程’ 或 设置 休眠时间?2,如何停止 ThreadPool里面的线程(里面线程还在执行,手动停止)?给了例子哦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1,thread.sleep(1000);//休眠1秒2,ThreadPool没用过,只用过自己写的线程控制器.但我想原理基本上也是ThreadPool取出线程对象,然后设置休眠. http://technet.microsoft.com/zh-cn/sysinternals/system.threading.threadpool(VS.95).aspx呵呵,刚查了system.threading.threadpool 发现... 简直还不如你自己写个线程控制器.比如你有20个线程. 你自己写个线程控制.可以是个hashtable可以是 object[] 建议后者.然后,根据index或者 key进行 单独的线程操作. 在达到如下目标时应使用线程池:1 要以简单的方式创建和删除线程2 应用程序使用线程时性能要优先考虑在达到如下目标时应使用Thread类1 要控制使用线程的优先级2希望所使用的线程维护其标示,该标示要与线程一起进行各种操作,经过不同时间段3所使用的线程的寿命比较长 只用过smart ThreadPool,他这里面有个组的概念 调用线程对象的Suspend()方法就可以挂起一个线程Thread.Sleep静态方法,使当前线程挂起指定的时间 http://hi.baidu.com/justear/blog/item/9055d45ae489ddd49c8204cc.html Suspend() 微软都不用了NET都显示过时,但没删除!这东西很容易引起死锁 模拟:一个线程更新数据,两个线程读取数据。更新的时候需要阻止读取的两个现成工作。而另外还有一个信号量来控制线程的退出。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace WindowsApplication35{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } System.Threading.ManualResetEvent mEvent = new System.Threading.ManualResetEvent(true); //判断线程安全退出的信号量 System.Threading.ManualResetEvent mEventStopAll = new System.Threading.ManualResetEvent(false); //*******ManualResetEvent的用法。 private void button1_Click(object sender, EventArgs e) { //一个线程模拟写入 new System.Threading.Thread(invokeWrite).Start(); //两个线程模拟读取 new System.Threading.Thread(invokeRead).Start(); new System.Threading.Thread(invokeRead).Start(); } private void invokeWrite() { for (int i = 0; i < 100; i++) { //判断线程安全退出 if (mEventStopAll.WaitOne(10, false) == true) break; //设置信号量,假设更新数据需要2秒,每更新一次暂停2秒. mEvent.Reset(); Console.WriteLine("正在更新..."); System.Threading.Thread.Sleep(2000); mEvent.Set(); System.Threading.Thread.Sleep(2000); } } private void invokeRead() { while (mEvent.WaitOne() == true) { //判断线程安全退出 if (mEventStopAll.WaitOne(10, false) == true) break; //假设读取一体数据用10毫秒.他需要判断信号量开关. Console.WriteLine("读取一条数据:"); System.Threading.Thread.Sleep(10); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { mEventStopAll.Set(); } }} 定义一个线程数int ThreadCount=0; /// <summary> /// 异步处理 /// </summary> private void AsyncWork(处理对象) { ThreadCount += 1;//线程+1 }private void AsyncWork_Complete(object sender) { ThreadCount -= 1; }结束的时候判断线程数是否为0Thread.Abord(Thread.CurrentThread);结束当前正在运行的进程 在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。 Suspend ()挂起.或者如果线程已挂起,则不起作用。 引发异常ThreadStateException未启动线程或线程已死。 SecurityException调用方没有适当的 SecurityPermission。Thread.Sleep(1000); 将当前线程阻塞指定的毫秒数。 Suspend和Resume啊...M$不建议用Suspend的原因是因为Suspend你无法精确控制线程停止的时机,如果线程占用了共享资源则在它Resume释放锁之前访问该资源的其它线程都会被阻塞。要精确控制,自己按时机需求用内核对象写吧...一个测试弄这么复杂干嘛?至于线程池里的,再什么池它也是线程啊。线程开始时用Thread.CurrentThread弄到手不就行了么... lock 和 Wait 之类就可以了 class Program { static Object[] ThreadManager = new object[3]; static void Main(string[] args) { Thread t1 = new Thread(new ThreadStart(Function1)); t1.Start(); ThreadManager[0] = t1; Thread t2 = new Thread(new ThreadStart(Function2)); t2.Start(); ThreadManager[1] = t2; Thread t3 = new Thread(new ThreadStart(Function3)); t3.Start(); ThreadManager[2] = t3; string strTemp = String.Empty; Thread tt2 = (Thread)ThreadManager[2]; while (true) { System.Console.WriteLine("main thread...输入命令......"); strTemp = System.Console.ReadLine(); if (strTemp == "1") { try { tt2.Suspend(); } catch(Exception ex) { string str = ex.ToString(); } System.Console.WriteLine("Function [3] Suspend......"); } else if (strTemp == "2") { tt2.Resume(); System.Console.WriteLine("Function [3] Resume......"); } else { Thread.Sleep(500); continue; } } } static void Function1() { while (true) { System.Console.WriteLine("Function [1] run......"); Thread.Sleep(3000); } } static void Function2() { while (true) { System.Console.WriteLine("Function [2] run......"); Thread.Sleep(3000); } } static void Function3() { while (true) { System.Console.WriteLine("Function [3] run......"); Thread.Sleep(3000); } } }测试通过. 需求满足. 没用!没共用资源! 你应该让他们都调用 FUN1 object[] obj = new object[1];public void linkstate(){//DS数据集for (int i = 0; i < Ds.Tables[0].Rows.Count; i++) { //_TB 一张新的表 DataRow dr0 = _TB.NewRow(); dr0["sysNO"] = Ds.Tables[0].Rows[i]["SYS_NO"].ToString(); dr0["groupNO"] = Ds.Tables[0].Rows[i]["GROUP_NO"].ToString(); dr0["TAG_NO"] = Ds.Tables[0].Rows[i]["TAG_NO"].ToString(); _TB.Rows.Add(dr0); ParameterizedThreadStart ParStart0 = new ParameterizedThreadStart(JanitorMethodDT); Thread myThread0 = new Thread(ParStart0); myThread0.Start(_TB); obj[i] = myThread0; }}private Object lockObj = new Object(); private void JanitorMethodDT(object ob) { DataTable de_All = (DataTable)ob; de_All.AcceptChanges(); if (de_All.Rows.Count > 0) { lock (lockObj) { Thread.Sleep(Convert.ToInt32(de_All.Rows[0]["time"])); try { //对 de_All数据的使用 } catch (Exception err) { //throw err; } } } }我这么写的,但是冒失有问题!de_All的数据很乱!求解啊! asp 如何保存线程的啊!!!我点击运行后,线程可能比较久,我想随时在点击一按钮,挂起或睡眠线程!!!如何 得到当前的线程 ????我放入 ViewState,可 取的时候一定是NULL! 你对线程的应用曲解已经很远了。 共用资源并非让你共用线程方法 所以肯定不需要共用fun1建议你最好还是找本高级编程的书看看吧 里面应该有讲线程问题 我给的示例代码只是应你帖子的需求来给的 。你的帖子开头并未提出资源共享的需求 ,在多个线程操作下。如果你需要所有线程都操作某个 dataset 或者其他什么,那么你根据我给的代码 再做修改也可以得到你 需要的东西。你只需要再 声明一个全局dataset即可。然后 各个线程方法都对 这个dataset进行操作。 比如 现在我3个线程方法都只执行了 System.Console.WriteLine这个动作,那么你 就 可以把这些动作换成对dataset的操作。。悟性很重要啊 。 多线程 如果全部靠自己理解还是很难的.除非你有看过优秀的多线程代码写的项目.我没说要锁住对象防止非安全操作难道你就不锁了.显然要锁.如果你仅仅是这样的需求:多个线程 对 ds进行修改.(增删改)1个线程 对ds进行读取. 那么我只能告诉你 这个需求的多线程编码相当简单,你不如把本贴放弃,再开一贴详细描述一下你具体需求 然后发出来,保证你会得到答案(很多人愿意为技术分而写代码帮助别人).但你这个贴最好直接放弃(无满意结贴),里面出言不逊太多,别人看了都不想回答. 也许偶对线程理解不够,还不至于不知道自已需求是什么!你的每一个现场调用一个FUN,是至于你明确知道要开启几线程,各自需要多什么!!这种简单应用完全不需要共用资源了,每个线程给单独资源就好,省去麻烦!现在,你创建线程数据根据数据库记录数创建;(你都不知道要创建多少线程,你打算写什么FUN来给它们每一个线程使用?)你的回答我实在不敢认同你对线程的能力! [Help]Oracle中Number/Data类型数据如何格式转换及存储空值问题。。。 如何删除服务器上图片 怎么用c#拷贝一段XML然后粘贴到它的下面。是下面~ 如何调用JAVASCRIPT方法,.Net问题 如何将一串日语假名写入二进制文件中? 急问:请问一个很简单的反射的问题 ~算法征集!!~ httpwebreuqest 取cookie的问题! 多线程写文件总是异常,怎么办 c#中有没有类似vb中chr()(ASCII转为字符)的方法 100分求解疑难问题 spread 导出Excel文件如何将表头也导出?
然后,根据index或者 key进行 单独的线程操作.
在达到如下目标时应使用Thread类1 要控制使用线程的优先级2希望所使用的线程维护其标示,该标示要与线程一起进行各种操作,经过不同时间段3所使用的线程的寿命比较长
Thread.Sleep静态方法,使当前线程挂起指定的时间
Suspend() 微软都不用了NET都显示过时,但没删除!
这东西很容易引起死锁
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication35
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.Threading.ManualResetEvent mEvent = new System.Threading.ManualResetEvent(true);
//判断线程安全退出的信号量
System.Threading.ManualResetEvent mEventStopAll = new System.Threading.ManualResetEvent(false);
//*******ManualResetEvent的用法。
private void button1_Click(object sender, EventArgs e)
{
//一个线程模拟写入
new System.Threading.Thread(invokeWrite).Start();
//两个线程模拟读取
new System.Threading.Thread(invokeRead).Start();
new System.Threading.Thread(invokeRead).Start();
}
private void invokeWrite()
{
for (int i = 0; i < 100; i++)
{
//判断线程安全退出
if (mEventStopAll.WaitOne(10, false) == true) break;
//设置信号量,假设更新数据需要2秒,每更新一次暂停2秒.
mEvent.Reset();
Console.WriteLine("正在更新...");
System.Threading.Thread.Sleep(2000);
mEvent.Set();
System.Threading.Thread.Sleep(2000);
}
}
private void invokeRead()
{
while (mEvent.WaitOne() == true)
{
//判断线程安全退出
if (mEventStopAll.WaitOne(10, false) == true) break;
//假设读取一体数据用10毫秒.他需要判断信号量开关.
Console.WriteLine("读取一条数据:");
System.Threading.Thread.Sleep(10);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
mEventStopAll.Set();
}
}
}
int ThreadCount=0;
/// <summary>
/// 异步处理
/// </summary>
private void AsyncWork(处理对象)
{
ThreadCount += 1;//线程+1
}
private void AsyncWork_Complete(object sender)
{
ThreadCount -= 1;
}
结束的时候判断线程数是否为0
Thread.Abord(Thread.CurrentThread);结束当前正在运行的进程
在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。
Suspend ()挂起.或者如果线程已挂起,则不起作用。 引发异常ThreadStateException未启动线程或线程已死。
SecurityException调用方没有适当的 SecurityPermission。
Thread.Sleep(1000); 将当前线程阻塞指定的毫秒数。
你无法精确控制线程停止的时机,如果线程占用了共享资源则在
它Resume释放锁之前访问该资源的其它线程都会被阻塞。要精确
控制,自己按时机需求用内核对象写吧...一个测试弄这么复杂干嘛?至于线程池里的,再什么池它也是线程啊。线程开始时用
Thread.CurrentThread弄到手不就行了么...
class Program
{
static Object[] ThreadManager = new object[3];
static void Main(string[] args)
{ Thread t1 = new Thread(new ThreadStart(Function1));
t1.Start();
ThreadManager[0] = t1; Thread t2 = new Thread(new ThreadStart(Function2));
t2.Start();
ThreadManager[1] = t2; Thread t3 = new Thread(new ThreadStart(Function3));
t3.Start();
ThreadManager[2] = t3; string strTemp = String.Empty;
Thread tt2 = (Thread)ThreadManager[2];
while (true)
{
System.Console.WriteLine("main thread...输入命令......");
strTemp = System.Console.ReadLine();
if (strTemp == "1")
{
try
{
tt2.Suspend();
}
catch(Exception ex)
{
string str = ex.ToString();
}
System.Console.WriteLine("Function [3] Suspend......");
}
else if (strTemp == "2")
{
tt2.Resume();
System.Console.WriteLine("Function [3] Resume......");
}
else
{
Thread.Sleep(500);
continue;
}
} } static void Function1()
{
while (true)
{
System.Console.WriteLine("Function [1] run......");
Thread.Sleep(3000);
}
} static void Function2()
{
while (true)
{
System.Console.WriteLine("Function [2] run......");
Thread.Sleep(3000);
}
} static void Function3()
{
while (true)
{
System.Console.WriteLine("Function [3] run......");
Thread.Sleep(3000);
}
}
}测试通过. 需求满足.
没用!没共用资源! 你应该让他们都调用 FUN1
public void linkstate()
{
//DS数据集
for (int i = 0; i < Ds.Tables[0].Rows.Count; i++)
{
//_TB 一张新的表
DataRow dr0 = _TB.NewRow();
dr0["sysNO"] = Ds.Tables[0].Rows[i]["SYS_NO"].ToString();
dr0["groupNO"] = Ds.Tables[0].Rows[i]["GROUP_NO"].ToString();
dr0["TAG_NO"] = Ds.Tables[0].Rows[i]["TAG_NO"].ToString();
_TB.Rows.Add(dr0);
ParameterizedThreadStart ParStart0 = new ParameterizedThreadStart(JanitorMethodDT);
Thread myThread0 = new Thread(ParStart0);
myThread0.Start(_TB);
obj[i] = myThread0;
}
}
private Object lockObj = new Object();
private void JanitorMethodDT(object ob)
{ DataTable de_All = (DataTable)ob;
de_All.AcceptChanges();
if (de_All.Rows.Count > 0)
{
lock (lockObj)
{
Thread.Sleep(Convert.ToInt32(de_All.Rows[0]["time"]));
try
{
//对 de_All数据的使用
}
catch (Exception err)
{
//throw err;
} }
}
}我这么写的,但是冒失有问题!de_All的数据很乱!求解啊!
你对线程的应用曲解已经很远了。 共用资源并非让你共用线程方法 所以肯定不需要共用fun1
建议你最好还是找本高级编程的书看看吧 里面应该有讲线程问题
悟性很重要啊 。
除非你有看过优秀的多线程代码写的项目.我没说要锁住对象防止非安全操作难道你就不锁了.显然要锁.如果你仅仅是这样的需求:
多个线程 对 ds进行修改.(增删改)
1个线程 对ds进行读取. 那么我只能告诉你 这个需求的多线程编码相当简单,你不如把本贴放弃,再开一贴详细描述一下你具体需求 然后发出来,保证你会得到答案(很多人愿意为技术分而写代码帮助别人).但你这个贴最好直接放弃(无满意结贴),里面出言不逊太多,别人看了都不想回答.
也许偶对线程理解不够,还不至于不知道自已需求是什么!你的每一个现场调用一个FUN,是至于你明确知道要开启几线程,各自需要多什么!!这种简单应用完全不需要共用资源了,每个线程给单独资源就好,省去麻烦!现在,你创建线程数据根据数据库记录数创建;(你都不知道要创建多少线程,你打算写什么FUN来给它们每一个线程使用?)你的回答我实在不敢认同你对线程的能力!