如何允许一个线程在另一个线程休眠时完成



我正在编写一个处理多个线程的 C# 控制台应用程序,但对于某些线程,我必须等待一段时间,而其他线程正在等待完成处于睡眠状态的线程的睡眠时间。那么,当一个线程处于休眠状态,而其他线程应该同时工作时,我如何实现并行编程呢?

我尝试的解决方案如下。我期望的输出是i == 1处于睡眠模式 1 分钟,直到其他两个i == 2i == 3应该同时打印。

static void Main(string[] args)
{
for (int i = 0; i < 10; i++) {
if (i == 1) {
Console.WriteLine("1");
System.Threading.Thread.Sleep(60000);
}
else if (i == 2) {
Console.WriteLine("2");
}
else if (i == 3) {
Console.WriteLine("3");
}
}
}
OUTPUT
2
3
(after one minute) 1

这是您的简单解决方案:

static void Main(string[] args)
{
Task task = null;
for (int i = 0; i < 10; i++)
{
if (i == 1)
{
task = Task.Run(() => {
Thread.Sleep(60000);
Console.WriteLine("1");
}
);
}
else if (i == 2)
{
Console.WriteLine("2");
}
else if (i == 3)
{
Console.WriteLine("3");
}
}
task.Wait();
}

但我很确定你需要更多的理解,线程是如何工作的。祝你好运:)

正如 mjwills 指出的那样,这里只有一个线程

当您启动应用程序时,这将创建一个线程,通常称为主线程。为了避免程序冻结,您倾向于尽量不要在主线程中Thread.Sleep()

话虽如此,当您想要创建一个类似于线程的新任务时,您可以通过以下方式处理:

static void Main(string[] args)
{
Task yourTask = Task.Run( () => {
// Do Something, like your sleep.
});
yourTask.Wait();
}

如果您希望任务同步运行(例如,您需要等待某些内容结束才能继续程序(,我建议您在上面的链接中查看任务类中的RunSynchronously()方法。如果您希望它异步运行(例如,您无需等待某些内容结束即可继续程序(,则可以查看此链接。

希望这有帮助。

虽然我知道这会被否决,但我忍不住指出,解决您问题的最简单解决方案可能是:

static void Main(string[] args)
{
Console.WriteLine("2");
Console.WriteLine("3");
System.Threading.Thread.Sleep(60000);
Console.WriteLine("1");
}

它提供了您想要的确切输出。它很简单,易于阅读和理解。它不使用循环或额外的线程 - 但您问题中的代码不需要这些东西。

最新更新