我创建了10个将分别请求服务器的线程。现在,每个线程都成功请求服务器,但没有线程获得响应。
如果线程未处于活动状态(由于操作系统进程调度),谁将收到响应?
private static void ThreadFunc()
{
var response = CallServer();
Console.writeline(response.Message);
}
以下代码行永远不会命中。
Console.writeline(response.Message);
答案 0 :(得分:3)
等待响应时,您的线程永远不会处于活动状态。它毕竟在等待。
操作系统将底层IO标记为已完成,并将该线程标记为就绪。将在未来的某个时间安排处理已完成的IO的结果。
“活跃”甚至意味着什么?出于本讨论的目的,可以阻止,准备和运行线程。在等待或IO期间,线程被阻止。等待完成后,标记为就绪。当操作系统决定安排它时,它会在某个时间点开始运行。
答案 1 :(得分:2)
前台/应用程序线程必须保持活动状态才能完成后台线程。如果在您的代码中,您正在使用ThreadPool
个线程(默认情况下Task
使用),并且您的控制台应用程序的主线程完成而不等待这些后台线程完成,则该过程终止。
以下是使用Task
s的示例:
static void Main()
{
List<Task> tasks = new List<Task>();
for( int i = 0; i < 10; ++i )
{
tasks.Add( Task.Factory.StartNew( () => ThreadFunc() ) );
}
// need this to keep process alive
// will continue once all tasks complete
Task.WaitAll( tasks.ToArray() );
}