Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Main在旋转新线程时等待,而在任务中却不等待_C#_Multithreading_Task Parallel Library_Console Application - Fatal编程技术网

C# 为什么Main在旋转新线程时等待,而在任务中却不等待

C# 为什么Main在旋转新线程时等待,而在任务中却不等待,c#,multithreading,task-parallel-library,console-application,C#,Multithreading,Task Parallel Library,Console Application,我想知道为什么在控制台应用程序中,如果我旋转一个新线程从Main运行,即使Main将到达终点,它也会等待,如果我旋转一个新任务,它会退出,而不是等待任务结束 e、 g vs 您已将SomeMethod设置为在不同的线程上运行,因此它现在是异步的。您没有等待结果,因此Main将继续并退出,从而终止进程中的两个线程 使用: 假设SomeMethod是可等待的,否则您只能在外部等待结果 Task.Run(() => SomeMethod()).Result; 阅读该属性的文档时,您会注意到有两

我想知道为什么在控制台应用程序中,如果我旋转一个新线程从Main运行,即使Main将到达终点,它也会等待,如果我旋转一个新任务,它会退出,而不是等待任务结束

e、 g

vs


您已将SomeMethod设置为在不同的线程上运行,因此它现在是异步的。您没有等待结果,因此Main将继续并退出,从而终止进程中的两个线程

使用:

假设SomeMethod是可等待的,否则您只能在外部等待结果

Task.Run(() => SomeMethod()).Result;

阅读该属性的文档时,您会注意到有两种类型的线程:后台线程和前台线程:

。。。后台线程不阻止进程终止。一旦属于进程的所有前台线程终止。。。所有剩余的后台线程都已停止且未完成


线程
构造函数阻止
进程终止的原因是,默认情况下,它创建前台线程,而基于任务的异步操作会自动在
线程池
上执行,默认情况下,线程池使用后台线程,并将允许进程在完成之前终止。

您必须等待任务完成,否则Main将停止。@ValentinPapin您不能在诸如Main之类的静态方法中等待查看属性。@PatrickRoberts可能是这一点的重复(包含在接受的答案中)这个可能的重复并不能回答我的问题。Start()也不会等待,但程序会等待线程执行完成。
static void Main(string[] args)
{
    Task.Run(() => SomeMethod());
    // Main will close / app shuts down without waiting for SomeMethod to finish
}
Task.Run(async () => await SomeMethod());
Task.Run(() => SomeMethod()).Result;