gpt4 book ai didi

c# - WCF 中的单向异步/等待调用

转载 作者:太空狗 更新时间:2023-10-29 21:34:37 25 4
gpt4 key购买 nike

我有一个遗留的 WCF 服务,其中有许多以最经典的方式实现的单向操作契约:

    // The interface
[OperationContract(IsOneWay = true, AsyncPattern = true)]
IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState);
void EndFinalizePublishing(IAsyncResult result);

// The service
public IAsyncResult BeginFinalizePublishing(PageContent pageContent, AsyncCallback callback, object asyncState)
{...}

所以这里一切正常,现在我需要将其转换为 C# 5 最新的异步/等待模式。注意操作的单向性质。我的问题:

  • 我想我需要从 OperationContract 属性中删除 AsyncPattern = true
  • 用接口(interface)中的 void 和类中的 async void 替换 IAsyncResult 返回类型。
  • 为方便起见,删除 Begin/End 并添加 Async 后缀。

现在我应该如何从客户端调用单向操作?没有在客户端使用 async/await 进行单向调用?

这是否正确,并且会在客户端产生真正的异步处理。

    // The proxy
public void FinalizePublishingAsync(PageContent pageContent)
{
Channel.FinalizePublishingAsync(pageContent);
}

// The consumer of the client
// No way to use await for void methods.
IComPublisherFinalizerClient cl = new IComPublisherFinalizerClient();
cl.FinalizePublishingAsync(content);
cl.Close();

最佳答案

首先,客户端与服务器完全分离。客户端或服务器可能是同步的,使用 IAsyncResult (APM) 异步代码,或使用 async (TAP) 异步代码。

其次,服务器端的async 方法应该返回Task,即使是单向通信也是如此。返回 void 的同步方法的 async 等价物是 async Task 方法,而不是 async void 方法。 async void 在 WCF 服务中尤其危险,因为它可能违反 ConcurrencyMode

因此您的服务器端步骤将如下所示:

  • 删除 OperationContract.AsyncPattern
  • Begin*/End* 方法对组合成一个返回Task*Async 方法。

您的客户端应该在其代理的接口(interface)上看到Task-返回方法,它应该等待。这并不意味着您正在等待响应;此 await 使您能够等待发送实际消息(如果有延迟)并检测 channel 通信错误(如果您使用可靠的 channel )。

关于c# - WCF 中的单向异步/等待调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com