C# 线程的挂起与恢复
2016-12-16 13:18
183 查看
AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。
线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为true;否则为 false。
通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。
胡工,用你说的类解决问题了,下面是代码:谢谢你的帮助
class Class1
{
public static bool ok = false;
static AutoResetEvent are = new AutoResetEvent(false);
public void add() {
while(true){
if (ok)
{
Console.WriteLine("你好");
Thread.Sleep(1000);
}
else {
Console.WriteLine("我等待");
are.WaitOne();
}
}
}
public static void begin(){
ok = true;
are.Set();
}
public static void end()
{
ok = false;
}
}
class Program
{
public static void Main(String[] args) {
Thread t = new Thread(new ThreadStart(new Class1().add));
Thread.CurrentThread.Name = "主线程";
t.Start();
t.Name = "Class1线程";
for (int i = 0; i < 10;i++ )
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
Class1.begin();
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
Class1.end();
t.Abort();
Console.WriteLine(t.Name + "状态:" + t.ThreadState);
Console.ReadLine();
}
}
--
内心的强大才是真正的强大............
在 2012-07-13 12:07:06,"胡国宏" <0719-8666290@163.com>
写道:
- 隐藏引用文字 -
线程的挂起与恢复,如MSDN所述,不推荐使用Thread..::.Suspend 和Thread..::.Resume方法。
打个比方,用斧子砍树,斧子抡起来,正准备用力往下砍,你叫我Suspend ,我根本刹不住,什么时间Suspend ?
应该是我自己最清楚,也就是这斧子抡下去后,我才能Suspend ,而后我可以在停了一段时间后Resume。
所以说要挂起和恢复线程,你可以通过AutoResetEvent 来控制挂起和恢复,用Sleep来暂停线程执行。
至于Timer(非form控件)本身就是多线程的,只是它是定时触发的。
[align=left]2012-07-13[/align]
[align=left]胡国宏[/align]
发件人:喻帆
发送时间:2012-07-12 19:06
主题:胡工,帮我解答下
收件人:"胡国宏"<0719-8666290@163.com>
抄送:
我最近学习C#时,一直困惑一个问题:
C#多线程的挂起和恢复,我想做一个很简单界面,上面有两个按钮,“启动”,“暂停”,我按“启动”时开始打印,按“暂停”时停止打印,再按“启动”又可以打印,这个功能的目的就是灵活的控制多线程
Java中是
thread.start();
while(true){
if(true){
System.......
this.wait(1000);
}else{
this.wait();
}
}
void start(){
true;
notiflly();
}
void stop(){
false;
}
一个线程一上来就进入wait状态,等需要时直接启动,需要暂停时就暂停
在C#中 他的挂起和回复的方法 thread.Suspend()和thread.Resume() 过时,那么我就不知道用什么办法达到上面的功能
我想在我们项目中接口部分必然用到多线程,但是我在查看代码是看到了一个Time类,我很费解(可能要我用Java写的话就会用到上面的代码去控制接口是否启动)
胡工,简单的帮我讲解下把
线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为true;否则为 false。
通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。
胡工,用你说的类解决问题了,下面是代码:谢谢你的帮助
class Class1
{
public static bool ok = false;
static AutoResetEvent are = new AutoResetEvent(false);
public void add() {
while(true){
if (ok)
{
Console.WriteLine("你好");
Thread.Sleep(1000);
}
else {
Console.WriteLine("我等待");
are.WaitOne();
}
}
}
public static void begin(){
ok = true;
are.Set();
}
public static void end()
{
ok = false;
}
}
class Program
{
public static void Main(String[] args) {
Thread t = new Thread(new ThreadStart(new Class1().add));
Thread.CurrentThread.Name = "主线程";
t.Start();
t.Name = "Class1线程";
for (int i = 0; i < 10;i++ )
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
Class1.begin();
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
Class1.end();
t.Abort();
Console.WriteLine(t.Name + "状态:" + t.ThreadState);
Console.ReadLine();
}
}
--
内心的强大才是真正的强大............
在 2012-07-13 12:07:06,"胡国宏" <0719-8666290@163.com>
写道:
- 隐藏引用文字 -
线程的挂起与恢复,如MSDN所述,不推荐使用Thread..::.Suspend 和Thread..::.Resume方法。
打个比方,用斧子砍树,斧子抡起来,正准备用力往下砍,你叫我Suspend ,我根本刹不住,什么时间Suspend ?
应该是我自己最清楚,也就是这斧子抡下去后,我才能Suspend ,而后我可以在停了一段时间后Resume。
所以说要挂起和恢复线程,你可以通过AutoResetEvent 来控制挂起和恢复,用Sleep来暂停线程执行。
至于Timer(非form控件)本身就是多线程的,只是它是定时触发的。
[align=left]2012-07-13[/align]
[align=left]胡国宏[/align]
发件人:喻帆
发送时间:2012-07-12 19:06
主题:胡工,帮我解答下
收件人:"胡国宏"<0719-8666290@163.com>
抄送:
我最近学习C#时,一直困惑一个问题:
C#多线程的挂起和恢复,我想做一个很简单界面,上面有两个按钮,“启动”,“暂停”,我按“启动”时开始打印,按“暂停”时停止打印,再按“启动”又可以打印,这个功能的目的就是灵活的控制多线程
Java中是
thread.start();
while(true){
if(true){
System.......
this.wait(1000);
}else{
this.wait();
}
}
void start(){
true;
notiflly();
}
void stop(){
false;
}
一个线程一上来就进入wait状态,等需要时直接启动,需要暂停时就暂停
在C#中 他的挂起和回复的方法 thread.Suspend()和thread.Resume() 过时,那么我就不知道用什么办法达到上面的功能
我想在我们项目中接口部分必然用到多线程,但是我在查看代码是看到了一个Time类,我很费解(可能要我用Java写的话就会用到上面的代码去控制接口是否启动)
胡工,简单的帮我讲解下把
相关文章推荐
- C# 挂起恢复运行线程代码
- C# 线程手册 第二章 .NET 中的线程 线程挂起与恢复
- C#使用Monitor处理线程的挂起和恢复
- C#多线程开发2:线程挂起,恢复与中止等操作
- C# 挂起恢复运行线程代码
- C# 挂起恢复运行线程代码
- C# 挂起恢复运行线程代码
- C# 线程的挂起与恢复
- [MFC]线程的挂起与恢复
- java线程等待、设置优先级、同步、挂起、恢复(Join、setPriority、synchronized、wait、notify……)
- 用C#语言写的多线程演示程序:两个线程,可以开始,可以暂停,可以恢复,可以清除。-
- 线程挂起 阻止有什么区别c#
- JAVA线程之三:线程的挂起和恢复
- 线程的挂起和恢复
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- linux 线程挂起恢复的简单示例
- C# 线程的暂停与恢复
- Windows Via C/C++:线程的挂起和恢复
- Window API (八)多线程的挂起、恢复、切换、终止线程
- 线程挂起与恢复