У меня есть приложение .Net 3.5, которое я использую в качестве службы.В этом приложении есть поток, который вызывает веб-службу и сохраняет эти данные в базе данных SQLite.
В процессе разработки у нас никогда не возникало никаких проблем с этим, но в процессе работы вызов веб-службы занимает до 20 секунд.Когда приложение вызывает веб-сервис и ждет проводника окон ответа, потому что он лагает и не отвечает.Когда вызов возвращается, проводник Windows снова работает в обычном режиме, пока не вызовет веб-службу и не дождется ответа.
Использование процессором процессора очень низкое и не увеличивается при вызове веб-службы.Я вижу попадание ввода-вывода на жесткий диск при записи в базу данных, но все происходит за доли секунды и, конечно, не может быть причиной замедления.
Любая помощь будет принята с благодарностью, поскольку яЯ в растерянности для этой проблемы прямо сейчас.
Machine Specs
Windows XP SP3
Intel core i5 3.2GHz
3.5 GB RAM
Код
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);
}