和Thread..::.Resume方法。你可以通过AutoResetEvent
来控制挂起和恢复,用Sleep来暂停线程执行。
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 = 0i <10i++ )
{
Console.WriteLine(i)
Thread.Sleep(1000)
}
Class1.begin()
for (int i = 0i <10i++)
{
Console.WriteLine(i)
Thread.Sleep(1000)
}
Class1.end()
t.Abort()
Console.WriteLine(t.Name + "状态:" + t.ThreadState)
Console.ReadLine()
}
}
第一个控制台程序运行时,m是有信号的,因此m.WaitOne(TimeSpan.FromSeconds(5),false)会立即返回true,if的测试条件为false(因为!true为false),会执行else部分,同时m变成无信号;第明贺二个控制台程序运行时,因为m是命名互斥体对象(可用于系统中的进程或线程同步),如果第一个控制台程序还没有运行过m.ReleaseMutex()语句(作用是使m变成有信号),则第二个控制台程序执行m.WaitOne(TimeSpan.FromSeconds(5),false)时,会阻塞5秒以等待m变成有信碰槐租号,如果第一个控制台程序没有在5秒内执行m.ReleaseMutex()语句,则第二个控制台程序会因等不到笑兆信号,导致m.WaitOne(TimeSpan.FromSeconds(5),false)5秒超时返回,会返回false,因此第二个控制台程序会执行if部分(因为!false为true)。
MSDN关于第二个参数的描述为:
------------
exitContext 类型:System.Boolean
如果等待之前先退出上下文的同步域(如果在同步上下文中),并在稍后重新获取它,则为 true;否则为 false
------------
1)同步上下文的概念:
同步上下文(synchronization context)禅脊概念简单解释如下:
为了实现同步,在编程时需要若干野渣对象共同使用(share)一把锁。这可以通过给类添加[Synchronization()]属性实现。例如,类A和类B就可以同用一个锁:
[Synchronization()]public class A{ ……}
[Synchronization()]
public class B{ ……}
这样,类A和类B构成了一个“同步上下文”
2)同步上下文的排他特性
要使用同步上颂袭悄下文中的对象,必须首先要获得锁。一但获得了锁,将阻止其他代码使用同步上下文中的对象。这就是同步上下文的排他特性。
3)假设在一个多线程环境中,线程A和线程B都会用到上面提到同步上下文中的对象。
//在线程A中WaitOne(1000, false)
线程A在等待且在超时时间到期前一直阻止其他线程(如线程B)对同步上下文对象的访问!
//在线程B中WaitOne(1000, true)
线程B在等待且在超时时间到期前,将允许其他线程(如线程A)对同步上下文对象的访问!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)