【问题标题】:After Task starts, it displays only if calling another methodTask启动后,只有调用其他方法才会显示
【发布时间】:2023-01-09 02:29:57
【问题描述】:
void Something() => System.Console.WriteLine("Something is done");
Task t = new Task(delegate {Something();});
t.Start();  // nothing activates unless the below code is uncommented
// System.Console.WriteLine(33);  //displays "33 \nSomething is done" as long as not commented out

我不了解有关 Task 的一些基本知识。在上面的代码中,如果第 4 行被注释掉,则控制台上不会写入任何内容,但如果您写入 System.Console.WriteLine(33),则会显示数字 33 和 "Something is done"

  1. 我不明白为什么t.Start()不写"Something is done"
  2. 为什么在t.Start() 之后写任何东西,激活它?

    谢谢你。


    更新:这是我的整个程序。目的是了解Task的行为,所以程序很小。

【问题讨论】:

  • 这是你的整个程序吗?您启动任务然后程序终止?
  • 是的。它旨在了解 Task 的行为,因此程序很小。
  • 你不会学到任何有用的东西。你有一个竞争条件:程序想要终止,而任务想要运行。两者都可以赢得比赛,这取决于是否具有确定性的因素。假设您研究了这些因素,并得出了可靠的结论。你打算在什么情况下利用这些知识?您是否计划创建许多组成元素相互斗争和破坏的程序?
  • 不同的人以不同的方式学习。我喜欢从一开始就尽可能多地了解基础知识。但那只是我。首先,我在这里学到了很多东西,非常感谢您的投入。你说得很好,但这就是我学习的方式,这对我帮助很大。谢谢你。

标签: c# asynchronous async-await task console-application


【解决方案1】:

主线程不会阻塞,因此会在没有Console.WriteLine 的情况下立即退出。 Console.WriteLine 在主线程上完成。

由于这是一个控制台应用程序,因此必须调用 Wait 方法以防止应用程序在任务完成执行之前终止。

t.Start();
t.Wait();  

参考: https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.start?view=net-7.0#system-threading-tasks-task-start

另一种方法是使 Main 方法异步。

public static async Task Main()
{
    Task t = new Task(delegate { Something(); });
    t.Start();
    await t;
}

【讨论】:

  • 谢谢你。但是,这并不能解释该行为。似乎程序在 Task t 完成之前结束,因此 Task 未完成。但是,当您将 Console.WriteLine 放在 t.Start() 之上时,任务 t 将完成,但我不明白为什么会这样,如果它在 Console.WriteLine 之后开始。
  • @richalot 更新了答案
  • 真对不起。我想我错过了一些明显的东西。如果你在程序的任何地方使用了Console.WriteLine,你就不需要使用t.wait(),它仍然可以正确运行。但是,根据您上面的回答,情况并非如此。所以我想我的问题是,如果在程序的任何地方使用 Console.WriteLine 允许它正确完成,为什么? Console.WriteLine,即使在程序的开头,与任务有什么关系?
  • 因为 Console.WriteLine 在主线程上运行。这个程序太快了,很快就退出了。在 Console.WriteLine 的情况下,它有足够的时间
  • 谢谢你。那就是我所缺少的。只是以任何方式减慢主线程的速度就是让任务有时间完成的原因。
猜你喜欢
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多