gpt4 book ai didi

c# - 为什么控制台上没有打印任何内容?

转载 作者:太空狗 更新时间:2023-10-29 22:07:54 24 4
gpt4 key购买 nike

我创建了 2 个打印 x 和 y 100 次的方法。我希望它们并发运行,我希望输出是 xxxxyxyxyyyxyyxyx... sthg 那样。它不打印任何东西。我在这里缺少一些逻辑吗?

using System;
using System.Threading.Tasks;

namespace ConsoleApplication32
{
internal class Program
{
public static async Task<int> Print1()
{
await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
Console.Write("x");
}
});

return 1;
}

public static async Task<int> Print2()
{
await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
Console.Write("y");
}
});

return 1;
}

public static void Run()
{
Task<int> i = Print1();
Task<int> k = Print2();
}

private static void Main(string[] args)
{
Run();
}
}
}

最佳答案

说明

我们需要调整几项以获得所需的输出:xxxxyxyxyyyxyyxyx

  1. Run 方法未等待 Task iTask k 完成

    • 这意味着控制台应用程序将在两个 Task 完成之前关闭
    • 作为Andrei Matracaru在他的回答中提到,如果您添加 Console.ReadLine(),它将阻止控制台应用程序在字符串打印到屏幕之前关闭。
    • 一个更优雅的解决方案是使用Task.WhenAllTask.WhenAll 将允许代码屈服于它的调用线程(在本例中为主线程),这不会卡住应用程序的 UI,并允许应用程序继续打印到屏幕直到 Task 完成。这对于一个简单的控制台应用程序来说似乎微不足道,但在构建任何用户交互应用程序(如移动或 Web 应用程序)时永远不要锁定主线程是至关重要的;锁定主线程是导致应用“卡住”的原因。
    • Camilo Terevinto上面的回答推荐Task.WaitAll。这也是不好的做法,因为它也会卡住应用程序; Task.WaitAll 不可等待,不能不屈服于调用线程。
  2. Print1()Print2() 从不屈服于主线​​程

    • 这些方法在后台线程上执行,但它们在 for 循环 中不包含 await
    • for 循环 中需要一个 await 来让 CPU 继续执行主线程,因为 Console.Write() 可以仅在主线程上打印到屏幕。

代码

using System;
using System.Threading.Tasks;

namespace ConsoleApplication32
{
internal class Program
{
public static async Task<int> Print1()
{
for (int i = 0; i < 100; i++)
{
Console.Write("x");
await Task.Delay(10);
}

return 1;
}

public static async Task<int> Print2()
{
for (int i = 0; i < 100; i++)
{
Console.Write("y");
await Task.Delay(10);
}

return 1;
}

public static async Task Run()
{
var i = Print1();
var k = Print2();

await Task.WhenAll(i, k);
}

private static void Main(string[] args)
{
Task.Run(async () => await Run()).GetAwaiter().GetResult();
}
}
}

输出

xyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxyxxyxyxyxy Press any key to continue...

C# 7.1 替代方案

C# 7.1 引入了 async Main 方法的功能。这意味着我们可以按如下方式调整 Main 方法:

    ...

private static async Task Main(string[] args)
{
await Run();
}
...

关于c# - 为什么控制台上没有打印任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45635219/

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