C# 在.NET核心WCF连接服务中是否存在同步方法?

C# 在.NET核心WCF连接服务中是否存在同步方法?,c#,wcf,.net-core,C#,Wcf,.net Core,我的.NET核心项目仅为WCF服务生成异步方法。有没有办法像在常规的.NET项目中那样使用同步方法 在常规.NET中,有同步和异步方法,如: WcfClient.MethodName和WcfClient.MethodNameAsync 在.NET核心中,只有WcfClient.MethodNameAsync 这个问题帮助了我: 但这一解决方案会带来其他问题。有没有关于如何生成同步方法/函数的想法?检查;他们讨论一些你可能感兴趣的事实 你说得对。我们的NetCore/Netstandard支持还

我的.NET核心项目仅为WCF服务生成异步方法。有没有办法像在常规的.NET项目中那样使用同步方法

在常规.NET中,有同步和异步方法,如:
WcfClient.MethodName
WcfClient.MethodNameAsync

在.NET核心中,只有
WcfClient.MethodNameAsync

这个问题帮助了我:

但这一解决方案会带来其他问题。有没有关于如何生成同步方法/函数的想法?

检查;他们讨论一些你可能感兴趣的事实

你说得对。我们的NetCore/Netstandard支持还不包括API的同步实现。 请注意,这一变化作为向.NetCore过渡的对等项目之一出现在我们的路线图上,我们将在其可用时尽快更新更具体的时间表

  • 埃雷兹瓦尼1529评论

您能为我们澄清一下您对同步方法的需求吗?总的来说,sync的资源效率远远低于async,这不是我们推荐给客户的东西。如果需要阻止异步调用,则始终可以使用.GetAwaiter.GetResult()

我们与CLR团队进行了一些对话,他们提供了以下指导:

如果从库中公开异步端点,请避免公开仅包装异步实现的同步方法。这样做会向使用者隐藏实现的真实性质,使用者应该决定如何使用实现。如果使用者选择阻止等待异步实现完成,这取决于调用者,他们可以睁大眼睛来完成。 这对于“异步上同步”的情况比“异步上同步”的情况更为重要,因为对于“异步上同步”,它可能会导致应用程序出现重大问题,例如挂起

由于上面列出的原因(资源消耗等),NET核心团队选择不支持真正的同步api。即使我们实现真正的同步,在某种程度上它也会以同步超过异步而告终。出于这个原因,我们认为添加虚假的同步API将是一个障碍,对我们的客户没有帮助。如果您对此有任何反馈,请告知我们。 佩马里姆斯夫特对此发表了评论

让我解释一下理由。如果库正在使用不支持True sync的库,则True sync不是库的选项,对于us和.NET Core来说就是这样。(不管怎样,对于进行网络调用的API来说,真正的同步有点用词不当,但这是一个不同的讨论。)所以我们有两个选择:创建一个异步包装上的同步,或者让调用方来做。但正如我们所看到的,官方的指导和普遍的智慧是,应该避免暴露包装。这是有充分理由的,它类似于避免包装同步调用的异步API。避免使用此类API不仅可以保持API表面的清洁,还可以避免混淆。客户会认为存在对同步或异步的真正支持,并在他们自己的公共界面中公开这一点,但后来发现底层实现实际上并不支持它!因此,我们得出结论,在这种情况下,最好遵循普遍的智慧

您认为避免死锁是必要的,这是正确的,特别是在异步同步场景中,所以让我简单介绍一下如何做到这一点。当线程调用异步方法并阻塞等待结果时,就会出现死锁问题,而异步方法链正在等待线程释放以便继续。解决方案是让异步方法在不同的上下文中工作,而不受有限的线程池的约束。这是使用ConfigureAwait在异步方法内部完成的,因此在库本身中避免了死锁

如果您觉得真正的同步很重要,那么您可以在上打开它,以在.NET Core中获得支持

  • 米罗伯斯评论道
因此,您可以更改项目以避免Azure或伪造同步调用

然而,在2018年,观点发生了变化:

好的,经过充分的讨论之后,我们决定按照由设置的引导,提供同步方法作为syncoverasync。在我们在库的未来版本中弃用同步API之前,这是用户的一个时间缓冲区

@copernicus365,为了让人们,特别是那些已经在使用该库的人更简单,我们的Netstandard2.0支持(包括desktop和Netcore之间的功能奇偶校验)将保持方法不变,在每个服务包拆分的相同名称空间/二进制中(拆分包目前正在预览)。当然,我们需要响应.NET团队在文档中提供的关于转换为异步的好处的指导,并尽可能清楚地表明它是隐藏的同步优于异步

非常感谢每一位花时间加入这个帖子并给我们反馈的人

一个相关的注意事项-对于已经在使用.NET桌面上的同步方法的现有用户,这些方法也将转向通过异步进行同步。我们正在修改代码库,以便在任何地方使用HttpClient(在桌面和.NET内核中),它不提供任何类型的真正同步。这是为了避免对所有内容进行单独的实现(一个使用HttpWebRequest,另一个使用HttpClient),这导致了不同实现之间的许多错误和行为差异

  • 埃雷兹瓦尼1529评论
2018年5月,.NET标准2.0的目标实现了这些变化