[英]AutoResetEvent() in C#
I have three two classes 我有三个两节课
Class A{
function A.1()
{
1. First calls B.2()
2. Checks for value X in class B.
}
}
Class B {
function B.1()
{
/*this function sets the variable X to true*/
}
function B.2()
{
/*Initiates the thread eventually that will start the function B.1 on different thread*/
}
}
I want to modify this so that, A.1() should wait until X is set/modified in Class B. This is what my approach is: 我想修改它,以便A.1()应该等到X在类B中设置/修改。这就是我的方法:
Class A{
function A.1()
{
1. First calls B.2()
**2. Call WaitforSet in class B**
3. Checks for value X in class B.
}
}
Class B {
/* Created one autoreset event S*/
function B.1()
{
/*this function sets the variable X to true*/
S.Set();
}
function B.2()
{
/*Initiates the thread eventually that will start the function B.1 on different thread*/
}
waitforSet()
{
S.waitone();
}
}
I am not sure why this is not working, as it puts both the thread on wait. 我不确定为什么这行不通,因为这两个线程都处于等待状态。 I expected waitforSet()
function should have put calling thread on wait and internal will continue setting X. When i checked the currentthread's managed thread id in waitforSet()
and B.1()
they are different. 我期望waitforSet()
函数应该已经将调用线程置于等待状态,并且内部将继续设置X。当我在waitforSet()
和B.1()
检查了当前线程的托管线程ID时,它们是不同的。
Can someone tell me what i am missing here or better way to achieve this? 有人可以告诉我我在这里缺少什么,或者更好的方法来实现这一目标吗?
PS: I am achieving this in C# PS:我正在用C#实现
I created this and it working normally, are you sure you are setting the initial state of AutoResetEvent to false in the constructor ? 我创建了它并且它正常工作,您确定要在构造函数中将AutoResetEvent的初始状态设置为false吗?
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.Name = "Console Thread";
var a = new A();
a.A1();
Console.WriteLine("Press return to exit...");
Console.Read();
}
}
public class A
{
public void A1()
{
var b = new B();
b.B2();
b.WaitForSet();
Console.WriteLine("Signal received by " + Thread.CurrentThread.Name + " should be ok to check value of X");
Console.WriteLine("Value of X = " + b.X);
}
}
public class B
{
private AutoResetEvent S = new AutoResetEvent(false);
public bool X { get; private set; }
public void B1()
{
X = true;
Console.WriteLine("X set to true by " + Thread.CurrentThread.Name);
S.Set();
Console.WriteLine("Release the hounds signal by " + Thread.CurrentThread.Name);
}
public void B2()
{
Console.WriteLine("B2 starting thread...");
var thread = new Thread(new ThreadStart(B1)) { Name = "B Thread" };
thread.Start();
Console.WriteLine("Value of X = " + X + " Thread started.");
}
public void WaitForSet()
{
S.WaitOne();
Console.WriteLine(Thread.CurrentThread.Name + " Waiting one...");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.