C# 异步WCF调用以保存线程?

C# 异步WCF调用以保存线程?,c#,wpf,wcf,asynchronous,async-await,C#,Wpf,Wcf,Asynchronous,Async Await,在中,有人建议我发送异步网络请求,而不是在后台线程上发送同步请求。原因是我不会浪费一根线。我想知道这是怎么回事 这是最初的方法。我能理解这里怎么有两条线。一个是主线程(1),一个是进行WCF调用的后台线程(Task.Run)(2): 这是我对建议方法的概述。我试图了解线程是如何保存的。在异步WCF调用之后,不会为来自异步WCF调用的回调创建另一个线程吗 进一步考虑后,如果不需要回调处理,可能只使用一个线程?在WPF客户端中,您的客户端中可能有一个OnClick,检查客户端是否被单击的线程在哪

在中,有人建议我发送异步网络请求,而不是在后台线程上发送同步请求。原因是我不会浪费一根线。我想知道这是怎么回事

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

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


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

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

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

同步持有线程和让回调方法在最后生成线程之间的主要区别在于线程池是一个池。当线程池中的线程完成其工作时,它不会被销毁,它会等待一段时间,以查看是否还有更多的工作要做,并且它将被重用以执行新的工作

所以这两个选择是

  • 让1个线程坐在那里等待,不做其他工作,等待函数解除阻止(同步+线程)
  • 重用已经完成工作的现有线程(或者如果没有线程在等待,则生成一个新线程,我们在下面),当操作系统告诉我们等待的信息出现时,给它一个处理回调的短任务,然后让线程返回池中,以便在其他回调进入时为它们执行其他工作

您正在编写什么类型的客户端应用程序?@JonSkeet这是一个WPF客户端。在异步网络调用中,没有线程正在运行进行调用。(你的UI线程仍在运行,像往常一样处理UI消息)好的,我想我现在明白了。两个线程仍然在使用,只是在后台线程的同步请求中,该线程正在等待WCF同步调用完成。在异步WCF调用中,没有等待。听起来对吗?对。在同步版本中,您需要在线程池中绑定线程(如果未指定任务,则它使用线程池线程),而它除了在线程池中使用线程等待响应之外,什么也不做。通过使用异步方法,它可以在池中保持线程空闲,直到响应返回。(注意,并非所有异步方法都使用线程池线程,这只是处理回调的一种常见方式)这正是我所需要的。谢谢,斯科特!