线程的挂起,停止

l171147904 2010-04-30 11:59:45
NET封装的 线程池类ThreadPool

1,怎么挂起里面的 ‘正在执行的线程’ 或 设置 休眠时间?
2,如何停止 ThreadPool里面的线程(里面线程还在执行,手动停止)?

给了例子哦
...全文
2270 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ny-6000 2010-10-22
  • 打赏
  • 举报
回复
好,学到了.
lyzhujc 2010-06-25
  • 打赏
  • 举报
回复
学习了,帮顶!
足球中国 2010-05-13
  • 打赏
  • 举报
回复
用信号量来控制不错。
qiqishardgel 2010-05-13
  • 打赏
  • 举报
回复
学习了,帮顶!
chichenzhe 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 l171147904 的回复:]
也许偶对线程理解不够,还不至于不知道自已需求是什么!

你的每一个现场调用一个FUN,是至于你明确知道要开启几线程,各自需要多什么!!这种简单应用完全不需要共用资源了,每个线程给单独资源就好,省去麻烦!

现在,你创建线程数据根据数据库记录数创建;(你都不知道要创建多少线程,你打算写什么FUN来给它们每一个线程使用?)

你的回答。。。我实在不敢认同你对线程的能力![/Quote]
实在不知道你是通过什么方式来臆测出的这样的结论.
"这种简单应用完全不需要共用资源了"

每1个线程有自己的线程函数 就不能 操作 公共资源了?
10个人用10个方法吃饭(1个边抠鼻子边吃饭,1个边打电话边吃饭),难道他们就不能去享用同1个电饭煲里的米饭了?

傲慢无理.又无理取闹,也许这是我最后一次回复你的帖子.
l171147904 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 chichenzhe 的回复:]
引用 26 楼 l171147904 的回复:
引用 22 楼 chichenzhe 的回复:
C# code

class Program
{
static Object[] ThreadManager = new object[3];
static void Main(string[] args)
{

Thread t1 = new Thread(new ThreadSt……
[/Quote]

也许偶对线程理解不够,还不至于不知道自已需求是什么!

你的每一个现场调用一个FUN,是至于你明确知道要开启几线程,各自需要多什么!!这种简单应用完全不需要共用资源了,每个线程给单独资源就好,省去麻烦!

现在,你创建线程数据根据数据库记录数创建;(你都不知道要创建多少线程,你打算写什么FUN来给它们每一个线程使用?)

你的回答。。。我实在不敢认同你对线程的能力!
l171147904 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 chichenzhe 的回复:]
我给的示例代码只是应你帖子的需求来给的 。

你的帖子开头并未提出资源共享的需求 ,在多个线程操作下。

如果你需要所有线程都操作某个 dataset 或者其他什么,那么你根据我给的代码 再做修改也可以得到你 需要的东西。你只需要再 声明一个全局dataset即可。

然后 各个线程方法都对 这个dataset进行操作。 比如 现在我3个线程方法都只执行了 System.Console……
[/Quote]

说起来,自然很简单!你测试了?
你无线程锁,无关联线程! 他们的数据不会乱?

你看看我 27楼写的代码。。。数据还是乱跳!你能修改?谢谢
chichenzhe 2010-05-05
  • 打赏
  • 举报
回复
多线程 如果全部靠自己理解还是很难的.
除非你有看过优秀的多线程代码写的项目.

我没说要锁住对象防止非安全操作难道你就不锁了.显然要锁.

如果你仅仅是这样的需求:
多个线程 对 ds进行修改.(增删改)
1个线程 对ds进行读取.

那么我只能告诉你 这个需求的多线程编码相当简单,你不如把本贴放弃,再开一贴详细描述一下你具体需求 然后发出来,保证你会得到答案(很多人愿意为技术分而写代码帮助别人).

但你这个贴最好直接放弃(无满意结贴),里面出言不逊太多,别人看了都不想回答.
chichenzhe 2010-05-04
  • 打赏
  • 举报
回复
我给的示例代码只是应你帖子的需求来给的 。

你的帖子开头并未提出资源共享的需求 ,在多个线程操作下。

如果你需要所有线程都操作某个 dataset 或者其他什么,那么你根据我给的代码 再做修改也可以得到你 需要的东西。你只需要再 声明一个全局dataset即可。

然后 各个线程方法都对 这个dataset进行操作。 比如 现在我3个线程方法都只执行了 System.Console.WriteLine这个动作,那么你 就 可以把这些动作换成对dataset的操作。

。。。。
悟性很重要啊 。
chichenzhe 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 l171147904 的回复:]
引用 22 楼 chichenzhe 的回复:
C# code

class Program
{
static Object[] ThreadManager = new object[3];
static void Main(string[] args)
{

Thread t1 = new Thread(new ThreadStart(Fu……


没用!没共用资源! 你……
[/Quote]

你对线程的应用曲解已经很远了。 共用资源并非让你共用线程方法 所以肯定不需要共用fun1
建议你最好还是找本高级编程的书看看吧 里面应该有讲线程问题
l171147904 2010-05-04
  • 打赏
  • 举报
回复
asp 如何保存线程的啊!!!

我点击运行后,线程可能比较久,我想随时在点击一按钮,挂起或睡眠线程!!!

如何 得到当前的线程 ????

我放入 ViewState,可 取的时候一定是NULL!
l171147904 2010-05-04
  • 打赏
  • 举报
回复
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的数据很乱!求解啊!
l171147904 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 chichenzhe 的回复:]
C# code

class Program
{
static Object[] ThreadManager = new object[3];
static void Main(string[] args)
{

Thread t1 = new Thread(new ThreadStart(Fu……
[/Quote]

没用!没共用资源! 你应该让他们都调用 FUN1
rizher 2010-05-01
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!帮顶!
chichenzhe 2010-04-30
  • 打赏
  • 举报
回复
http://technet.microsoft.com/zh-cn/sysinternals/system.threading.threadpool(VS.95).aspx

呵呵,刚查了system.threading.threadpool 发现... 简直还不如你自己写个线程控制器.

比如你有20个线程. 你自己写个线程控制.可以是个hashtable可以是 object[] 建议后者.
然后,根据index或者 key进行 单独的线程操作.
chichenzhe 2010-04-30
  • 打赏
  • 举报
回复
1,thread.sleep(1000);//休眠1秒

2,ThreadPool没用过,只用过自己写的线程控制器.但我想原理基本上也是ThreadPool取出线程对象,然后设置休眠.
xyytuo 2010-04-30
  • 打赏
  • 举报
回复
studentliudong 2010-04-30
  • 打赏
  • 举报
回复
学习下~~
chichenzhe 2010-04-30
  • 打赏
  • 举报
回复

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);
}
}
}

测试通过. 需求满足.
Jeffrey84 2010-04-30
  • 打赏
  • 举报
回复
lock 和 Wait 之类就可以了
加载更多回复(17)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧