在 WCF 中返回或等待 Task<T>

Posted

技术标签:

【中文标题】在 WCF 中返回或等待 Task<T>【英文标题】:Returning or awaiting Task<T> in WCF 【发布时间】:2018-10-13 18:10:24 【问题描述】:

假设我有一个 WCF Websocket 服务:

[ServiceContract(CallbackContract =typeof(ICallback))]
public interface ISomeInterface
       
    [OperationContract]
    string GiveMeString();

现在,在客户端,感谢 WCF,我还可以使用 GiveMeStrignAsync 方法。现在,我想创建使用这种 WCF 生成的异步方法的客户端 API。 有两种方法可以做到这一点:

public  Task<string> GiveMeStringAsync()   //method on client side

   Task<string> task = null;
   try
   
      task = ServiceReference.GiveMeStringAsync();
   
    catch (Exception ex)
   
      Console.WriteLine(ex.Message);
   
   return task;       

那我就等待这个方法。

或者也许在这个方法中使用 await:

public async Task<string> GiveMeStringAsync()   //method on client side

   string s = String.Empty;
   try
   
      s = await ServiceReference.GiveMeStringAsync();
   
   catch (Exception ex)
   
      Console.WriteLine(ex.Message);
   
   return s;       

我的问题:

    根据我对 async/await 的正确理解,在第二个示例中,我仍需要在某处等待此方法,因此会有更多等待。更多的等待会导致性能下降?

    假设我是对的,选项 1 是可行的方法。如果在我的客户端我有一些该 API 的包装器(不管为什么)。在这个包装类中,当调用包装类的方法(调用API的方法)时,我仍然应该返回(而不是等待)任务并只使用一次等待?

【问题讨论】:

【参考方案1】:

似乎您需要的是microsoft post 关于此,但我会尝试根据您的要求进行总结:

更多的等待会降低性能吗?

如果您只测量单个螺纹。您等待任务的全部原因是,长时间等待的任务不会阻塞您可能同时进行的其他工作。

你怎么去await没有标记async的Task方法?您还应该考虑其他一些因素,例如:您真的希望 try/catch 在没有 await 的情况下工作吗?应该不会吧。

简单的答案是一直等待/异步,不要忘记在适当的情况下使用CancellationTokens 和.ConfigureAwait(false);

【讨论】:

以上是关于在 WCF 中返回或等待 Task<T>的主要内容,如果未能解决你的问题,请参考以下文章

从 WCF 返回 IObservable<T>

异步调用 WCF 服务并在新任务中等待它

为啥 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样?

我从只返回 Task 而不是 Task<T> 的方法返回啥?

使用 IMemoryCache 缓存结果 Task<T> 的正确方法

为啥要在 C# 中使用 Task<T> 而不是 ValueTask<T>?