gpt4 book ai didi

C# Task.Factory.StartNew 长时间运行

转载 作者:行者123 更新时间:2023-11-30 15:59:30 26 4
gpt4 key购买 nike

我想找出为什么需要阻止以下内容才能让控制台写入:

Task.Factory.StartNew(() => Console.WriteLine("KO"), TaskCreationOptions.LongRunning);

这不是:

new Thread(() => Console.WriteLine("KO")).Start();

简而言之,根据 C# 5.0,TaskCreationOptions.LongRunning 应该使任务不使用池线程(后台线程),这意味着它应该像常规线程一样使用前台线程线程,除了常规线程外,不需要 Console.ReadlineWait() 但使用 Task 没关系无论是否长时间运行,我总是必须以某种方式阻塞主线程。

那么 LongRunningOnComplete()GetAwaiter()GetResult() 或任何其他应该呈现结果的函数如果我总是必须自己阻塞主线程才能实际获得结果?

最佳答案

您依赖于未定义的行为。不要那样做。

您无需等待任务完成 - 这是确保它以某种方式实际完成的唯一方法。我假设你只是在使用一个控制台应用程序,除了上面的代码什么都没有 - 当线程实际到达 Console.WriteLine 部分时,主线程已经死了,所有的后台都死了线程。 new Thread 默认创建一个前台线程,这会阻止整个应用程序退出,尽管“主”线程已终止。

任务(以及任何类型的异步操作,实际上)背后的想法是它们允许您发出并发请求,并构建异步操作链(使它们同步运行,这通常是您想要的)。但是您仍然需要同步点来实际制作一个可行的应用程序 - 如果您的应用程序在任务完成之前退出,那就太糟糕了:)

如果您只是执行 Console.ReadLine 而不是等待任务显式完成,您就会看到这一点 - 它仍然在后台运行,独立于执行的主线程,但现在您给它足够的时间来完成。在大多数应用程序中,您异步对主线程执行异步操作 - 例如,单击按钮的结果可能是不会阻塞 UI 的异步 HTTP 请求,但如果 UI 已关闭,请求仍然终止。

关于C# Task.Factory.StartNew 长时间运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504140/

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