Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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# 如果调用线程未激活,谁将从服务器接收响应?_C#_Multithreading - Fatal编程技术网

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

C# 如果调用线程未激活,谁将从服务器接收响应?,c#,multithreading,C#,Multithreading,我创建了10个线程,分别请求服务器。现在,每个线程都成功地请求服务器,但没有线程得到响应 如果线程未处于活动状态(由于操作系统进程调度),谁将收到响应? private static void ThreadFunc() { var response = CallServer(); Console.writeline(response.Message); } 下面的代码行从未命中 Console.writeline(response.Message); 等待响应时,线程将永远不会处于活

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

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

private static void ThreadFunc()
    {
var response = CallServer();
Console.writeline(response.Message);
}
下面的代码行从未命中

Console.writeline(response.Message);

等待响应时,线程将永远不会处于活动状态。毕竟它还在等待

操作系统将底层IO标记为已完成,并将线程标记为就绪。将安排在未来某个时间处理已完成IO的结果


“主动”是什么意思?在本讨论中,线程可以被阻塞、就绪并运行。在等待或IO期间,线程被阻塞。等待完成后,它被标记为就绪。当操作系统决定调度它时,它会在稍后的某个时间点开始运行。

前台/应用程序线程必须保持活动状态才能完成后台线程。如果在代码中使用
ThreadPool
线程(默认情况下
Task
s使用该线程),并且控制台应用程序的主线程在不等待这些后台线程完成的情况下完成,则进程终止

下面是一个使用
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() );
    }
static void Main()
{
列表任务=新列表();
对于(int i=0;i<10;++i)
{
tasks.Add(Task.Factory.StartNew(()=>ThreadFunc());
}
//需要这个来保持进程的活力吗
//所有任务完成后,将继续
Task.WaitAll(tasks.ToArray());
}

这是一个控制台应用程序吗?显示更多的代码,例如线程的创建,以及在
Console.writeline(response.Message)中出现错误后会发生什么永不命中,它只意味着一件事
CallServer()
永不返回。或者您的进程在此之前终止。由于存在“操作系统进程调度”来管理I/O,因此与任何操作系统调度/调度工件相比,这个问题更可能是由于您的客户端代码错误造成的。在服务器端没有问题,我看到的是服务器端的日志。服务器正在正确发送响应。问题出在调用端。@操作我相信您是对的-问题出在您的客户端代码(或数据/协议)中的错误。“CallServer”在做什么?你的意思是在得到响应时,操作系统会将相应的线程标记为活动线程?甚至“活动”是什么意思?在本讨论中,线程可以被阻塞、就绪并运行。在等待或IO期间,线程被阻塞。等待完成后,它被标记为就绪。当操作系统决定调度它时,它会在稍后的某个时间点开始运行。所谓“活动”,我的意思是“以运行的形式”。usr是对的。您的客户端线程将被阻止,直到收到数据,此时它们将准备就绪。如果您的机器没有过载,操作系统会立即将就绪线程分派到一个内核上,它会运行并处理数据。@operation ok。你的问题解决了吗?这应该是根据我的理解。