[英]Converting synchronous WCF service client calls to asynchronous
我正在学习线程,任务和异步编码,并试图将这些概念应用于我每天工作的Web窗体应用程序。
到目前为止,我有:
来自的客户电话已更改
MyServiceClient msc = new MyServiceClient(); try { myData = msc.GetData(); msc.Close(); } catch (Exception) { msc.Abort(); throw; }
至
MyServiceClient msc = new MyServiceClient();
try
{
myData = msc.GetDataAsync().Result;
msc.Close();
}
catch (Exception)
{
msc.Abort();
throw;
}
我直接调用结果来隐式地在任务上调用.Wait()并在很大程度上保持代码不变。
我直接调用结果来隐式地在任务上调用.Wait()并在很大程度上保持代码不变。
我根本不建议这样做。 在一般情况下, 在async
代码中调用Result
或Wait
会导致死锁 (正如我在博客中所解释的)。 由于svcutil
实现方法的方式,它可能(当前)有效,但是我不建议您开始编写这样的代码。
允许async
通过代码库增长更好:
MyServiceClient msc = new MyServiceClient();
try
{
myData = await msc.GetDataAsync();
msc.Close();
}
catch (Exception)
{
msc.Abort();
throw;
}
- 为了在执行I / O时释放应用程序池中的线程用于其他工作,这是否正确?
不。您的工作真的没有意义。 您根本不让调用异步。
如果使用await
,那么可以,您确实会获得异步操作的好处(即释放UI线程)。
- 我是否需要以不同的方式处理异常?
如果您使用的是await
,那么不会,您现有的代码可以正常工作。 如果使用的是Result
,那么可以,所有异常都将包装在AggregateException
。
- 还需要Close()和Abort()吗?
是。
如果调用异步版本并等待完成比正常方式更好,那么框架可以为您透明地进行此操作。 它没有做到这一点的事实向您表明这种方法不好。
如果我使用await,则需要将堆栈中的每个方法标记为异步,这需要更多工作。
就是这样 您必须更改整个调用堆栈,因为在IO运行时,线程必须将控制权返回给线程池。 您必须退出堆栈上的所有功能。 谢谢上帝,异步/等待使这主要是机械锻炼。
因此,您应该使用async / await 来响应您否则无法获得的性能需求。 默认情况下不使用它。 首先确定当前是否实际有太多线程。 如果不是这样,您极有可能根本不需要异步。 在其他地方投资时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.