繁体   English   中英

将同步WCF服务客户端调用转换为异步

[英]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()并在很大程度上保持代码不变。

  1. 为了在执行I / O时释放应用程序池中的线程用于其他工作,这是否正确?
  2. 我是否需要以不同的方式处理异常?
  3. 还需要Close()和Abort()吗?

我直接调用结果来隐式地在任务上调用.Wait()并在很大程度上保持代码不变。

我根本不建议这样做。 在一般情况下, async代码中调用ResultWait会导致死锁 (正如我在博客中所解释的)。 由于svcutil实现方法的方式,它可能(当前)有效,但是我不建议您开始编写这样的代码。

允许async通过代码库增长更好:

MyServiceClient msc = new MyServiceClient();
try
{
     myData = await msc.GetDataAsync();                    
     msc.Close();
}
catch (Exception)
{
     msc.Abort();
     throw;
}
  1. 为了在执行I / O时释放应用程序池中的线程用于其他工作,这是否正确?

不。您的工作真的没有意义。 您根本不让调用异步。

如果使用await ,那么可以,您确实会获得异步操作的好处(即释放UI线程)。

  1. 我是否需要以不同的方式处理异常?

如果您使用的是await ,那么不会,您现有的代码可以正常工作。 如果使用的是Result ,那么可以,所有异常都将包装在AggregateException

  1. 还需要Close()和Abort()吗?

是。

如果调用异步版本并等待完成比正常方式更好,那么框架可以为您透明地进行此操作。 它没有做到这一点的事实向您表明这种方法不好。

如果我使用await,则需要将堆栈中的每个方法标记为异步,这需要更多工作。

就是这样 您必须更改整个调用堆栈,因为在IO运行时,线程必须将控制权返回给线程池。 您必须退出堆栈上的所有功能。 谢谢上帝,异步/等待使这主要是机械锻炼。

因此,您应该使用async / await 来响应您否则无法获得的性能需求。 默认情况下不使用它。 首先确定当前是否实际有太多线程。 如果不是这样,您极有可能根本不需要异步。 在其他地方投资时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM