gpt4 book ai didi

c# - 屏障类c#

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:07 25 4
gpt4 key购买 nike

我确实了解 C# 中使用的 Barrier 类。但是,在下面的代码中,我不明白为什么 SignalAndWait() 被调用了两次?任务中的调用还不够吗?该代码基本上模拟了三个 friend (或任务)从 A 到 B,B 到 C,有些从 B 返回到 A 而没有去 C 的情况。请帮帮我。顺便说一句,这段代码来自本书:MCSD Certification Exam Toolkit(70-483)。非常感谢!

static void Main(string[] args) 
{
var participants = 5;
Barrier barrier = new Barrier(participants + 1,
b => { // This method is only called when all the paricipants arrived.
Console.WriteLine("{0} paricipants are at rendez-vous point {1}.",
b.ParticipantCount -1, // We substract the main thread.
b.CurrentPhaseNumber);
});
for (int i = 0; i < participants; i++)
{
var localCopy = i;
Task.Run(() => {
Console.WriteLine("Task {0} left point A!", localCopy);
Thread.Sleep(1000 * localCopy + 1); // Do some "work"
if (localCopy % 2 == 0) {
Console.WriteLine("Task {0} arrived at point B!", localCopy);
barrier.SignalAndWait();
}
else
{
Console.WriteLine("Task {0} changed its mind and went back!", localCopy);
barrier.RemoveParticipant();
return;
}
Thread.Sleep(1000 * (participants - localCopy)); // Do some "morework"
Console.WriteLine("Task {0} arrived at point C!", localCopy);
barrier.SignalAndWait();
});
}

Console.WriteLine("Main thread is waiting for {0} tasks!",
barrier.ParticipantCount - 1);
barrier.SignalAndWait(); // Waiting at the first phase
barrier.SignalAndWait(); // Waiting at the second phase
Console.WriteLine("Main thread is done!");
}

最佳答案

您还会看到行 Console.WriteLine("{0} participants are at rendez-vous point {1}.",...) 执行了两次。

单个 Barrier 实例用于在 B 和 C 处会合。(剩余的)taks 调用 SignalAndWait() 以标记它们到达 B 和 C,因此两次调用。

打扮代码:

   if (localCopy % 2 == 0) 
{
...
barrier.SignalAndWait(); // arrival at B
}
else
{
...
barrier.RemoveParticipant(); // return to A
return;
}
...
barrier.SignalAndWait(); // arrival at C

关于c# - 屏障类c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24975239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com