Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
.net 并发模式多对异步/等待_.net_Wcf_Asynchronous_Async Await - Fatal编程技术网

.net 并发模式多对异步/等待

.net 并发模式多对异步/等待,.net,wcf,asynchronous,async-await,.net,Wcf,Asynchronous,Async Await,假设您有一个WCF服务 [ServiceBehavior( IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)] 在此实现下,使用异步/等待模式进行服务操作有什么区别?即使未使用a

假设您有一个WCF服务

[ServiceBehavior(
    IncludeExceptionDetailInFaults = true, 
    InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple,
    UseSynchronizationContext = false)]
在此实现下,使用异步/等待模式进行服务操作有什么区别?即使未使用async/await,服务调用是否也会被合并并可能异步执行?即使在阅读了大量msdn和博客文章之后,我仍然不清楚上面的场景,我会将我的操作异步化以确保安全

即使未使用async/await,服务调用是否也会被合并并可能异步执行

不,ConcurrencyMode.Multiple将允许多个线程同时执行调用,但这与异步处理不同

考虑单个同步请求:单个线程将接收该请求并一直执行它,直到完成为止。如果该线程阻塞,则有一个阻塞的线程等待该请求完成。您可以指定ConcurrencyMode.Multiple以允许其他线程进入并执行其他调用,而不会阻塞其他请求

现在考虑一个异步请求:一个线程将接受请求并开始执行它。该线程将等待,而不是阻塞,从而将线程返回到线程池,直到异步操作完成。这意味着在该请求上没有阻塞线程。当方法在等待后恢复时,线程池中的一些线程将用于继续请求,最终其中一个线程将完成请求

底线是服务器端的异步允许比同步代码更大的规模,因为异步操作的开销比线程低

ConcurrencyMode处理了一个不同的问题:它涉及到您的服务实现的线程安全性。如果可以同时进行多个调用,则应指定ConcurrencyMode.multiple。如果您有自然异步的操作,那么应该使它们异步。如果您是线程安全的并且天生异步的,那么您应该同时做到这两个方面

即使未使用async/await,服务调用是否也会被合并并可能异步执行

不,ConcurrencyMode.Multiple将允许多个线程同时执行调用,但这与异步处理不同

考虑单个同步请求:单个线程将接收该请求并一直执行它,直到完成为止。如果该线程阻塞,则有一个阻塞的线程等待该请求完成。您可以指定ConcurrencyMode.Multiple以允许其他线程进入并执行其他调用,而不会阻塞其他请求

现在考虑一个异步请求:一个线程将接受请求并开始执行它。该线程将等待,而不是阻塞,从而将线程返回到线程池,直到异步操作完成。这意味着在该请求上没有阻塞线程。当方法在等待后恢复时,线程池中的一些线程将用于继续请求,最终其中一个线程将完成请求

底线是服务器端的异步允许比同步代码更大的规模,因为异步操作的开销比线程低

ConcurrencyMode处理了一个不同的问题:它涉及到您的服务实现的线程安全性。如果可以同时进行多个调用,则应指定ConcurrencyMode.multiple。如果您有自然异步的操作,那么应该使它们异步。如果您是线程安全的并且天生异步的,那么您应该同时做到这两个方面