.NET Core WCF 连接服务中是否有同步方法?

QTM*_*QTM 5 c# wcf .net-core

我的 .NET Core 项目只为 WCF 服务生成异步方法。有没有办法像在常规 .NET 项目中一样使用同步方法?

在常规的.NET有两个同步和异步方法,如: WcfClient.MethodNameWcfClient.MethodNameAsync

在 .NET Core 中只有 WcfClient.MethodNameAsync

这个问题对我帮助: How to call asynchronous method from synchronous method in C#?

但是这个解决方案会导致其他问题。任何想法如何生成同步方法/函数?

小智 4

检查这个 GitHub 问题;他们讨论一些您可能感兴趣的事实。

\n
\n

你是对的。我们的 NetCore/Netstandard 支持尚不包括 API 的同步实现。\n请注意,此更改已在我们的路线图中作为过渡到 .NetCore 的奇偶校验项目之一,我们将尽快更新更具体的时间表可用的。

\n\n
\n

\n
\n

您能为我们澄清一下您对同步方法的需求吗?总体而言,同步的资源效率比异步低得多,因此我们不向客户推荐这种方式。如果您需要阻止异步调用,您始终可以使用 .GetAwaiter.GetResult()。

\n

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

\n
\n

如果您从库中公开异步端点,请避免公开仅包装异步实现的同步方法。这样做向消费者隐藏了实现的真实本质,并且应该由消费者决定他们想要如何使用该实现。如果消费者选择阻塞等待异步实现完成,则\xe2\x80\x99由调用者决定,他们可以睁大眼睛这样做。\n这对于\xe2\x80\ x9csync 在 async\xe2\x80\x9d 情况下比 \xe2\x80\x9casync 在sync\xe2\x80\x9d 情况下,因为对于 \xe2\x80\x9csync 在 async 情况下,\xe2\x80\x9d 可以导致应用程序出现严重问题,例如挂起。

\n
\n

由于上面列出的原因(资源消耗等),.NET Core 团队选择不支持真正的同步 api。即使我们实现真正的同步,它最终也会在某种程度上通过异步实现同步。因此,我们认为添加假同步 api 对我们的客户来说将是一种障碍,而不是帮助。如果您对此有任何反馈,请告知我们。\npemari-msft 于2017 年 5 月 11 日发表评论

\n
\n

\n
\n

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

\n

您说得对,避免死锁至关重要,尤其是在异步同步场景中,所以让我简单介绍一下这是如何完成的。当线程调用异步方法然后阻塞等待结果,而异步方法链正在等待线程释放以便它可以继续时,就会出现死锁问题。解决方案是让异步方法在不同的上下文中完成工作,这样它就不会受到有限的线程池的限制。这是使用ConfigureAwait 在异步方法内部完成的,因此库本身避免了死锁。

\n

如果您认为真正的同步很重要,那么您可以在https://github.com/dotnet/corefx上提出这一点,以在 .NET Core 中获得支持。

\n\n
\n

因此,您可以更改项目以避免 Azure 或虚假同步调用。

\n

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

\n
\n

好吧,经过足够的讨论,按照HttpWebRequest的引导,我们决定提供同步方法作为异步同步。在我们在库的未来版本中弃用同步 API 之前,这是我们用户的一个时间缓冲。

\n

@copernicus365,为了让人们更简单,特别是那些已经在使用该库的人,我们的 Netstandard2.0 支持(包括桌面和 Netcore 之间的功能对等)将按原样保留方法,位于相同的命名空间/二进制文件中按服务拆分包(拆分包目前处于预览状态)。当然,我们\xe2\x80\x99需要回应.NET团队在我们的文档中关于转换为异步的好处的指导,并尝试尽可能清楚地表明\xe2\x80\x99是异步之上的同步在幕后。

\n

非常感谢所有花时间参与此主题并向我们提供反馈的人!

\n

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

\n\n
\n

这些更改于 2018 年 5 月登陆 .NET Standard 2.0 目标。

\n