在另一个 SO question中,建议我发送异步网络请求,而不是在后台线程上发送同步请求。原因是为了不浪费一个线程。我试图理解这是怎么回事。
这是原始方法。我可以理解这里有两个线程。一个是主线程 (1),一个是进行 WCF 调用的后台线程 (Task.Run) (2):
这是我建议的方法的草图。我试图了解如何保存线程。在异步 WCF 调用之后,不会为异步 WCF 调用的回调创建另一个线程吗?
进一步考虑后,如果不需要回调处理,也许只使用一个线程?
在另一个 SO question中,建议我发送异步网络请求,而不是在后台线程上发送同步请求。原因是为了不浪费一个线程。我试图理解这是怎么回事。
这是原始方法。我可以理解这里有两个线程。一个是主线程 (1),一个是进行 WCF 调用的后台线程 (Task.Run) (2):
这是我建议的方法的草图。我试图了解如何保存线程。在异步 WCF 调用之后,不会为异步 WCF 调用的回调创建另一个线程吗?
进一步考虑后,如果不需要回调处理,也许只使用一个线程?
在您的 WPF 客户端OnClick
中,您的客户端中可能有一个地方,检查客户端是否被单击的线程在哪里?
操作系统本身的答案是检查点击,然后将消息传递给消息泵,该消息泵反过来调用您的函数。WCF 函数的回调是这样的,操作系统本身正在监听回复消息,当它收到回复消息时,它将发送一个信号,该信号将在线程池中找到一个空闲线程并在那时执行回调。
同步持有线程和让回调方法最后生成线程的主要区别在于线程池是一个池。当线程池中的一个线程完成它的工作时,它不会被销毁,它会等待一段时间,看看是否有更多的工作可以完成,然后它会被重新用于完成新的工作。
所以这两个选择是
ThreadPool.GetMaxThreads()
当操作系统告诉我们我们等待的信息已经出现时,重用已经完成工作的现有线程(或者如果没有等待并且我们在下面,则生成一个新线程),给它处理回调的简短任务,然后让线程回到池中,以便在其他回调进入时为它们做其他工作。