Проводник Windows перестает отвечать, когда приложение вызывает веб-сервис - PullRequest
2 голосов
/ 22 марта 2012

У меня есть приложение .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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...