异步WCF调用保存线程?

在另一个SO问题中 ,我被建议发送异步网络请求,而不是在后台线程上发送同步请求。 原因是我不浪费一个线程。 我试图理解这是怎么回事。

这是最初的方法。 我可以理解这里有两个线程。 一个是主线程(1),一个是进行WCF调用的后台线程(Task.Run)(2):

在此处输入图像描述

这是我建议的方法的草图。 我试图了解如何保存线程。 在异步WCF调用之后,是否不会为异步WCF调用的回调创建另一个线程?

在此处输入图像描述

在进一步思考之后,如果不需要回调处理,可能只使用一个线程?

在您的WPF客户端中,您可能在客户端的某处有一个OnClick ,检查客户端是否被点击的线程在哪里?

操作系统本身的答案是检查点击,然后将消息传递给消息泵,消息泵又调用您的function。 WCF函数的回调就是这样,OS本身正在侦听回复消息,当它获得回复消息时,它将发送一个信号,该信号将在线程池中找到一个空闲线程并在那时执行回调。

同步保持线程和让回调方法最终生成线程的主要区别在于线程池是一个池 。 当线程池中的线程完成其工作时,它不会被破坏,它会等待一段时间,看看是否有更多的工作要做, 并且它将被重用来完成这项新工作。

所以这两个选择是

  • 让1个线程坐在那里等待没有其他工作等待解除阻塞function(Sync + thread)
  • 重新使用已经完成它的工作的现有线程(或者如果没有等待我们在ThreadPool.GetMaxThreads()之下,则生成一个新ThreadPool.GetMaxThreads() )当操作系统告诉我们等待的信息已经显示时,给它一个简短的任务处理回调,然后让线程回到池中为其他回调做其他工作。