有没有办法让wpf + wcf工作得更快?

时间:2013-12-18 20:47:39

标签: c# .net wpf wcf mvvm

在使用WPF服务开发WCF应用程序时,我意识到有时应用程序非常慢。例如,当我从WCF服务中调用返回列表的方法时,执行此操作需要花费太多时间。这是一些代码:

MVVM:

private ObservableCollection<tblStock> _Stocks;
public ObservableCollection<tblStock> Stocks
{
   get
   {
      return _Stocks;
   }
   set
   {               
      _Stocks = value;
      OnPropertyChanged("Stocks");
   }
}

private ObservableCollection<tblClient> _Clients;
public ObservableCollection<tblClient> Clients
{
   get
   {
      return _Clients;
   }
   set
   {                
      _Clients = value;
      OnPropertyChanged("Clients");
   }
}

当我打开一个窗口时,有两个组合框绑定到这些属性。这些属性在我的视图模型类的构造函数中设置,如下所示:

Clients = new ObservableCollection<tblClient>(wcf.GetClients());
Stocks = new ObservableCollection<tblStock>(wcf.GetStocks());    

有时在窗口打开时加载这些组合框需要7到10秒。我不明白为什么当列表计数非常小时需要这么多时间:2和8项。 以下是wcf服务的方法:

List<tblClient> IService.GetClients()
{
   context = new PanErpLiteEntities();
   List<tblClient> cntnt = (from c in context.tblClients select c).ToList();
   return cntnt;
}

所以我的实际问题是:减慢我的申请速度的可能原因是什么?我发布了这个问题,因为当有数百万个原因导致应用程序工作缓慢时,我很难在谷歌上找到答案,所以我实际上是在这里提示。我希望我做得足够清楚。

1 个答案:

答案 0 :(得分:2)

你在谷歌上发现了一百万件事,因为可能有一百万件事情可能导致这种缓慢。你需要做的是学习如何识别缓慢的位置,即“剖析”。

在您的情况下,您需要分析三件事。

  • 你的客户端程序挂在哪里“
  • WCF请求和回复线路所花费的时间
  • List<tblClient> IService.GetClients()花费最多时间的地方。

对于第一个和第三个项目,您需要一个代码分析器。有一个built in to Visual Studio,还有很多free and paid 3rd party ones available too

对于您可以enable tracing in WCF itself的第二项,它可以像在服务器上的App.config文件中添加以下内容一样简单。

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

当您关闭服务器时,您可以在visual studio附带的“服务跟踪查看器”中查看Traces.svclog(您也可以启用autoFlush,而无需等待服务停止刷新缓冲区,但这会给你带来性能损失。)

获得所有新信息后,您可以回到这里并提出一个新问题,例如“如何让第一个请求WCF服务器更快地完成?”或“为什么此实体框架查询需要很长时间“或其他完全。