在使用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;
}
所以我的实际问题是:减慢我的申请速度的可能原因是什么?我发布了这个问题,因为当有数百万个原因导致应用程序工作缓慢时,我很难在谷歌上找到答案,所以我实际上是在这里提示。我希望我做得足够清楚。
答案 0 :(得分:2)
你在谷歌上发现了一百万件事,因为可能有一百万件事情可能导致这种缓慢。你需要做的是学习如何识别缓慢的位置,即“剖析”。
在您的情况下,您需要分析三件事。
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服务器更快地完成?”或“为什么此实体框架查询需要很长时间“或其他完全。