如果调用线程未激活,谁将从服务器收到响应?

时间:2014-01-24 10:54:22

标签: c# multithreading

我创建了10个将分别请求服务器的线程。现在,每个线程都成功请求服务器,但没有线程获得响应。

如果线程未处于活动状态(由于操作系统进程调度),谁将收到响应?

private static void ThreadFunc()
    {
var response = CallServer();
Console.writeline(response.Message);
}

以下代码行永远不会命中。

Console.writeline(response.Message);

2 个答案:

答案 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() );
    }