【发布时间】:2016-11-19 09:36:38
【问题描述】:
假设我有一个代表任务的 A 类和一个 B 类。 我想进行一个实验,要开始实验,我需要完成至少 5 个 B 任务和仅 1 个 A 任务。
我有以下课程
abstract class Task
{
public int Id;
public void Start(object resetEvent)
{
EventWaitHandle ewh = (EventWaitHandle)resetEvent;
Thread.Sleep(new Random(DateTime.Now.Ticks.GetHashCode()).Next(5000, 14000));
Console.WriteLine("{0} {1} starts",this.GetType().Name, Id);
ewh.Set();
}
}
class A : Task
{
static int ID = 1;
public A(EventWaitHandle resetEvent)
{
Id = ID++;
new Thread(StartTask).Start(resetEvent);
}
}
class B : Task
{
static int ID = 1;
public B(EventWaitHandle resetEvent)
{
Id = ID++;
new Thread(StartTask).Start(resetEvent);
}
}
以及以下主要
static void Main()
{
A a;
B[] bs = new B[20];
int numberOfBs = 0;
EventWaitHandle aResetEvent = new AutoResetEvent(false);
EventWaitHandle bResetEvent = new AutoResetEvent(false);
a = new A(aResetEvent);
for (int i = 0; i < bs.Length; i++)
bs[i] = new B(bResetEvent);
while (numberOfBs < 5)
{
bResetEvent.WaitOne();
numberOfBs++;
}
aResetEvent.WaitOne();
Console.WriteLine("Experiment started with {0} B's!", numberOfBs);
Thread.Sleep(3000); // check how many B's got in the middle
Console.WriteLine("Experiment ended with {0} B's!", numberOfBs);
}
现在我有几个问题/疑问:
如何在可能的 M 中只等待 N 个信号?
我能否只使用 1 个 AutoResetEvent 来实现我想要的结果?
我不明白为什么所有任务都打印在一起,我希望每个任务都在完成时打印,现在在所有任务都完成时打印。
以下代码线程安全吗?
.
while (numberOfBs < 5)
{
bResetEvent.WaitOne();
numberOfBs++;
}
可能是这对线程一起发出信号吗?如果是这样,我可以使用锁定 bResetEvent 来解决这个问题吗?
【问题讨论】:
-
也许您应该使用
CountdownEvent而不是AutoResetEvent? -
“我能达到我想要的结果吗”,你想要的结果是什么?
-
@YacoubMassad 我有义务使用这个 ResetEvent,即使我会调查这个 CountDownEvent。至于想要的结果 - 我希望能够控制 5 B 任务和 1 A 任务何时完成
-
“我希望能够控制5个B任务和1个A任务什么时候完成” --“控制”是什么方式?您可以完全“控制”它们而无需任何同步;即通过启动它们,您已经控制了它们,使得它们将“很快”完成(这就是“何时”)。大概这不是您所说的那种“控制”。你的意思是什么?请具体。
-
我的意思是准确控制它们何时完成,例如我希望能够知道至少 5 B 和 1 A 何时完成
标签: c# multithreading oop autoresetevent