Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 为什么要实现异步WCF服务操作_C#_Wcf - Fatal编程技术网

C# 为什么要实现异步WCF服务操作

C# 为什么要实现异步WCF服务操作,c#,wcf,C#,Wcf,我找到了以下说明如何实现异步WCF服务操作的文档: 这让我想知道,当客户机可以自己生成操作的异步版本时,为什么(或何时)要使我的服务操作异步。当客户端生成操作的异步版本时,是否与服务本身已经实现异步操作相同 此外,在文档中的示例代码中,end方法没有OperationContractAttribute。为什么?我想你的问题的答案就在你提供的链接之后。 在这里()您可以看到: 如果操作服务实现发出阻塞调用(如执行I/O工作),请在服务操作实现中使用异步方法。在异步操作实现中,尝试调用异步操作和方

我找到了以下说明如何实现异步WCF服务操作的文档:

这让我想知道,当客户机可以自己生成操作的异步版本时,为什么(或何时)要使我的服务操作异步。当客户端生成操作的异步版本时,是否与服务本身已经实现异步操作相同


此外,在文档中的示例代码中,end方法没有OperationContractAttribute。为什么?

我想你的问题的答案就在你提供的链接之后。 在这里()您可以看到:

如果操作服务实现发出阻塞调用(如执行I/O工作),请在服务操作实现中使用异步方法。在异步操作实现中,尝试调用异步操作和方法以尽可能扩展异步调用路径。例如,从BeginOperationOne()中调用BeginOperationTwo()


因此,当您的服务使用另一个服务(例如Redis)或下载任何内容时,同样以异步方式实现这些操作,而不是阻塞服务器的工作线程,这是绝对有意义的。工作线程的数量是有限的,在某些情况下,您的服务器会被卡住,因为它们都在服务于调用。在异步实现的情况下,您可以利用usin I/O完成端口和来自单独线程池的适当I/O线程。是Windows中非常有效的机制,有助于避免资源浪费。

我认为您的问题的答案就在您提供的链接之后。 在这里()您可以看到:

如果操作服务实现发出阻塞调用(如执行I/O工作),请在服务操作实现中使用异步方法。在异步操作实现中,尝试调用异步操作和方法以尽可能扩展异步调用路径。例如,从BeginOperationOne()中调用BeginOperationTwo()


因此,当您的服务使用另一个服务(例如Redis)或下载任何内容时,同样以异步方式实现这些操作,而不是阻塞服务器的工作线程,这是绝对有意义的。工作线程的数量是有限的,在某些情况下,您的服务器会被卡住,因为它们都在服务于调用。在异步实现的情况下,您可以利用usin I/O完成端口和来自单独线程池的适当I/O线程。是Windows中非常有效的机制,有助于避免资源浪费。

这也让我感到困惑。似乎每个人都在等待狂暴,但是如果服务器已经在处理请求了,那么我们就不能得到太多的效率提升,我们会非常头疼。似乎如果你有一台处理能力很强的服务器,你可以处理更多的负载。这是唯一的原因吗?我认为当客户端生成操作的异步版本时,它仍然在服务器上同步运行。正确吗?是的,这些将是客户端机器上的异步请求(以这种方式生成它们),但它们仍将在服务器机器上同步运行,因为它们最初不是异步函数。所以,是的,我认为只有超高流量的服务器才需要实现异步服务操作。你几乎可以做到。但如果不使用某种锁,它们也不会在服务器上同步运行。每个请求都在一个单独的线程中,对吗?因此,如果我异步地从同一个客户机分派DoThing1,然后分派DoThing2,那么DoThing2有可能首先完成,因为它们在不同的线程中运行。因此,当线程可以说处理这一部分,然后处理那一部分时,所有线程都在使用的流量非常小。如果你是处理器绑定的异步是没有意义的(不再有太多了)。。。如果您是I/O绑定的,那么异步可以提供更好的性能。这也让我感到困惑。似乎每个人都在等待狂暴,但是如果服务器已经在处理请求了,那么我们就不能得到太多的效率提升,我们会非常头疼。似乎如果你有一台处理能力很强的服务器,你可以处理更多的负载。这是唯一的原因吗?我认为当客户端生成操作的异步版本时,它仍然在服务器上同步运行。正确吗?是的,这些将是客户端机器上的异步请求(以这种方式生成它们),但它们仍将在服务器机器上同步运行,因为它们最初不是异步函数。所以,是的,我认为只有超高流量的服务器才需要实现异步服务操作。你几乎可以做到。但如果不使用某种锁,它们也不会在服务器上同步运行。每个请求都在一个单独的线程中,对吗?因此,如果我异步地从同一个客户机分派DoThing1,然后分派DoThing2,那么DoThing2有可能首先完成,因为它们在不同的线程中运行。因此,当线程可以说处理这一部分,然后处理那一部分时,所有线程都在使用的流量非常小。如果你是处理器绑定的异步是没有意义的(不再有太多了)。。。如果您是I/O绑定的,异步将提供更好的性能。