gpt4 book ai didi

c# - 为什么这个任务会立即退出?

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

我一直在到处使用 System.Threading.Tasks.Task.Run() 并取得了巨大成功。我最近发现我的一个进程过早退出,因为任务没有完成。显然,我没有第一条线索 System.Threading.Tasks.Task.Run() 实际上是如何工作的,我的 100,000 多行 C# 代码(三个 Windows 服务、Web 应用程序、数据库和内存进程间缓存)是如何工作的纯粹靠运气。这是代码的简化版本。为什么进程没有执行延迟就退出了?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskWaitDemo
{
class Program
{
static void Main(string[] args)
{
Task.Run(() =>
{
while (true)
{
try
{
Task.Delay(60 * 1000).Wait();
// In my actual code I perform real computation right here after the wait.
Console.WriteLine("why does this line never execute???");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
});
}
}
}

编辑

为了拥抱与线程无关的任务世界,我将任务用于两个主要目的:1) 将工作排队到线程池,以及 2) 异步处理周期性任务。我上面的例子是一个过于简化的尝试来展示一个周期性任务的例子。在我的实际应用程序中,While (true) { ... } 实际上更像是 while (!_shutdown) { ... }

各种评论和答案都建议简单地等待任务,但在我的实际应用程序中,主线程在启动任务后可能有也可能没有事情要做,并且不能简单地等待我的周期性任务而不会永远阻塞。

在过去的线程时代,线程 A 会启动线程 B,然后如果它无事可做,它可能会优雅地退出,让线程 B 愉快地做它的事情,进程仍在运行。

似乎,在全新的任务世界中,线程 A 运行任务 B(将一些工作排​​队,可能是周期性的,到线程池),然后如果它无事可做,它可能会优雅地退出。然后框架将任务 B(显然还有任何其他通过任务排队到线程池的工作)扔到位桶中,进程终止。我觉得坏了。

我想我的答案是为周期性任务使用良好的旧线程,并希望并祈祷线程池队列中的所有即发即弃任务在允许应用程序关闭之前完成。

最佳答案

您运行 while(true),是的,这是正确的,但是您在另一个线程 上运行它。

相反,主线程运行整个 Main 并退出应用程序。

        static void Main(string[] args)
{

//MAIN THREAD BOUNDS
//LAUNCH THE TASK AND GO AHEAD
var task = Task.Run(() => (EDIT)
{
//SECOND THREAD BOUNDS
while (true)
{
...
}
//--------------
});
task.Wait(); (EDIT) //WAIT FOR TASK COMPLETION !!!!

//NOTHING MORE TO DO, SO EXIT APP AND KILL Task.Run THREAD
}

编辑

如果您需要等待完成,只需使用 Task.Wait ,就像在编辑的代码中一样。在这个具体示例中,它没有任何意义,这并不一定意味着它不会出现在你的中。

关于c# - 为什么这个任务会立即退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24737673/

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