C# 为什么Main在旋转新线程时等待,而在任务中却不等待
我想知道为什么在控制台应用程序中,如果我旋转一个新线程从Main运行,即使Main将到达终点,它也会等待,如果我旋转一个新任务,它会退出,而不是等待任务结束 e、 g vsC# 为什么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; 阅读该属性的文档时,您会注意到有两
您已将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;