我正在查看此网站threads。 我一直在玩代码来回答“CountdownEvent是否会阻止所有线程?” 我得到的答案是否定的。然后我决定使用传递给CountdownEvent的数字。这是我的代码
namespace ThreadPractice
{
class Program
{
static CountdownEvent CountDown = new CountdownEvent(4);
static void Main()
{
new Thread(() => SaySomething("I am Thread one.")).Start();
new Thread(() => SaySomething("I am thread two.")).Start();
new Thread(() => SaySomethingElse("Hello From a different Thread")).Start();
new Thread(() => SaySomething("I am Thread Three.")).Start();
CountDown.Wait();
Console.Read();
}
static void SaySomething(string Something)
{
Thread.Sleep(1000);
Console.WriteLine(Something);
CountDown.Signal();
}
static void SaySomethingElse(string SomethingElse)
{
Thread.Sleep(1000);
Console.WriteLine(SomethingElse);
}
}
}
我期待调用SaySomethingELse()的线程执行但其他线程也执行,即使只调用了四个信号。
为什么这样做?
谢谢,
dhoehna
答案 0 :(得分:5)
在我看来,你有Signal
和Wait
错误的方式。如果您希望SaySomething
来电等待倒计时达到0,则应致电Wait
。这是一个例子:
using System;
using System.Threading;
namespace ThreadPractice
{
class Program
{
static CountdownEvent CountDown = new CountdownEvent(4);
static void Main()
{
new Thread(() => SaySomething("I am Thread one.")).Start();
new Thread(() => SaySomething("I am thread two.")).Start();
new Thread(() => SaySomethingElse("Hello From a different Thread")).Start();
new Thread(() => SaySomething("I am Thread Three.")).Start();
for (int i = 0; i < 4; i++)
{
Console.WriteLine("Calling Signal (time #{0})", i);
CountDown.Signal();
Thread.Sleep(1000);
}
Console.WriteLine("Done");
}
static void SaySomething(string Something)
{
CountDown.Wait();
Console.WriteLine(Something);
}
static void SaySomethingElse(string SomethingElse)
{
Thread.Sleep(1000);
Console.WriteLine(SomethingElse);
}
}
}
输出:
Calling Signal (time #0)
Hello From a different Thread
Calling Signal (time #1)
Calling Signal (time #2)
Calling Signal (time #3)
I am Thread one.
I am Thread Three.
I am thread two.
Done
答案 1 :(得分:1)
嗯...在我看来,你想等待所有的线程完成,然后再继续主线程。如果是这样,你忘记了SaySomethingElse()中的Signal()。这可以防止CountDown.CurrentCount达到0(零),这就是为什么你的主线程被&#34;卡住&#34;您将其设置为4,它只会下降到1(一)。解决它,你应该得到所需的?结果:
class Program
{
static CountdownEvent CountDown = new CountdownEvent(4);
static void Main()
{
new Thread(() => SaySomething("I am Thread one.")).Start();
new Thread(() => SaySomething("I am thread two.")).Start();
new Thread(() => SaySomethingElse("Hello From a different Thread")).Start();
new Thread(() => SaySomething("I am Thread Three.")).Start();
CountDown.Wait();
Console.WriteLine("Done!");
Console.Read();
}
static void SaySomething(string Something)
{
Thread.Sleep(1000);
Console.WriteLine(Something);
CountDown.Signal();
}
static void SaySomethingElse(string SomethingElse)
{
Thread.Sleep(1000);
Console.WriteLine(SomethingElse);
CountDown.Signal();
}
}
输出:
I am Thread one.
I am thread two.
Hello From a different Thread
I am Thread Three.
Done!