在 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
的情况下工作吗?应该不会吧。
简单的答案是一直等待/异步,不要忘记在适当的情况下使用CancellationToken
s 和.ConfigureAwait(false);
。
【讨论】:
以上是关于在 WCF 中返回或等待 Task<T>的主要内容,如果未能解决你的问题,请参考以下文章
为啥 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样?
我从只返回 Task 而不是 Task<T> 的方法返回啥?