C# 应用程序调用web服务时Windows资源管理器未响应
我有一个作为服务运行的.NET3.5应用程序。此应用程序有一个线程,该线程调用web服务并将该数据存储在SQLite数据库中 在开发过程中,我们从未遇到过任何问题,但在生产过程中,web服务调用最多需要20秒才能完成。当应用程序调用web服务并由于延迟和无响应而等待答复时,windows资源管理器。当调用返回时,windows资源管理器将再次正常运行,直到调用web服务并等待答复为止 进程的cpu使用率非常低,在调用web服务时不会出现峰值。当硬盘写入数据库时,我可以看到它受到了I/O的冲击,但这一切都发生在一瞬间,肯定不是速度减慢的原因 任何帮助都将不胜感激,因为我现在对这个问题不知所措C# 应用程序调用web服务时Windows资源管理器未响应,c#,.net,windows,web-services,C#,.net,Windows,Web Services,我有一个作为服务运行的.NET3.5应用程序。此应用程序有一个线程,该线程调用web服务并将该数据存储在SQLite数据库中 在开发过程中,我们从未遇到过任何问题,但在生产过程中,web服务调用最多需要20秒才能完成。当应用程序调用web服务并由于延迟和无响应而等待答复时,windows资源管理器。当调用返回时,windows资源管理器将再次正常运行,直到调用web服务并等待答复为止 进程的cpu使用率非常低,在调用web服务时不会出现峰值。当硬盘写入数据库时,我可以看到它受到了I/O的冲击,但
Machine Specs
Windows XP SP3
Intel core i5 3.2GHz
3.5 GB RAM
代码
密码是prod中的DB调用导致了20秒的延迟吗?是的,dev中的DB调用需要100毫秒,但是prod中的DB调用需要20秒,我正在对此进行优化。我将发布一些代码。如果数据库是瓶颈,那么由于服务器上的负载和表+记录锁,它可能会非常好。您何时开始/结束交易?您使用的是什么隔离级别?有两个数据库。1数据库已连接到web服务。这是SQL Server数据库,查询需要20秒,但web服务使用者正在写入的SQLite数据库只需要一秒钟的时间来写入。我遇到的问题是web服务使用者而不是服务器,尽管服务器显然需要tlc。如果无法优化DB调用,一个选项是异步调用WCF服务。我不能评论你的线程/工作者实现,因为没有发布代码。代码?是prod中的DB调用导致了20秒的延迟吗?是的,dev中的DB调用需要100毫秒,但是prod中的DB调用需要20秒,我正在对此进行优化。我将发布一些代码。如果数据库是瓶颈,那么由于服务器上的负载和表+记录锁,它可能会非常好。您何时开始/结束交易?您使用的是什么隔离级别?有两个数据库。1数据库已连接到web服务。这是SQL Server数据库,查询需要20秒,但web服务使用者正在写入的SQLite数据库只需要一秒钟的时间来写入。我遇到的问题是web服务使用者而不是服务器,尽管服务器显然需要tlc。如果无法优化DB调用,一个选项是异步调用WCF服务。我不能评论你的线程/工作者实现,因为没有发布任何代码。
public void UpdateMembers()
{
var moreMembersToUpdate = true;
while (moreMembersToUpdate)
{
var response = GetMembersToUpdate();
if (response != null)
{
UpdateLicense(response.licensed);
if (response.memberResult == null || response.memberResult.recordsReturned == 0)
break;
}
else
break;
UpdateMemberCache(response.memberResult.memberList, response.memberResult.lastUpdate,
response.memberResult.lastMembersTransactionID);
moreMembersToUpdate = response.memberResult.recordsLeft;
}
}
public void UpdateLicense(bool licensed)
{
var list = DataMapper.GetMapper().QueryForList("Select.License", null);
if (list != null && list.Count > 0)
{
var isLicensed = (Boolean) list[0];
if(isLicensed != licensed)
{
DataMapper.GetMapper().Update("Update.License", licensed);
}
}
else
DataMapper.GetMapper().Insert("Insert.License", licensed);
}
public StoredValueResponse GetMembersToUpdate()
{
var token = new OperationToken
{
company = Settings.GetCompany(),
storeID = Settings.GetStoreID(),
operationID = Guid.NewGuid().ToString(),
batchSize = 3000,
password = Settings.GetPassword(),
userName = Settings.GetCompany()
};
var lastSync = GetLastMemberCacheSync();
return WebMethods.GetUpdatedMemberCache(token, lastSync.TransactionDetailID);
}
public MemberSyncRecord GetLastMemberCacheSync()
{
var lastMemberSync = DataMapper.GetMapper().QueryForList("Select.LastMemberUpdate", null);
if (lastMemberSync != null && lastMemberSync.Count > 0 && lastMemberSync[0] != null)
return (MemberSyncRecord)lastMemberSync[0];
var record = new MemberSyncRecord
{
LastMembersTransactionTime = new DateTime(1900, 1, 1),
TransactionDetailID = 0
};
return record;
}
public void UpdateMemberCache(SmallMemberInfo[] members, DateTime lastSyncTime, long transactionDetailID)
{
try
{
DataMapper.GetMapper().BeginTransaction();
foreach (var member in members)
{
DataMapper.GetMapper().Insert("Insert.MemberInfo", member);
}
DataMapper.GetMapper().CommitTransaction();
}
catch(Exception)
{
DataMapper.GetMapper().RollBackTransaction();
throw;
}
UpdateMemberCacheSyncHistory(lastSyncTime, members.Length, transactionDetailID);
}