c # - Windows Explorer får ikke svar, mens applikationen kalder webtjeneste

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et. Net 3.5-program, som jeg har kørt som en tjeneste. Denne applikation har en tråd, der kalder en webservice og gemmer disse data i en SQLite-database.


Under udvikling har vi aldrig haft nogen problemer med dette, men i produktionen tager opkaldet op til 20 sekunder at fuldføre. Når applikationen kalder webtjenesten og venter på replik windows explorer fordi laggy og ikke reagerer. Når opkaldet vender tilbage, virker explorer normalt igen, indtil det kalder webtjenesten og venter på svaret.


CPU-brugen af ​​processen er meget lav og spiser ikke, når du ringer til webtjenesten. Jeg kan se I/O-hit til harddisken, når den skriver til databasen, men at alt sker i et split sekund og sikkert ikke kan være årsagen til afmatningen.


Enhver hjælp ville blive meget værdsat, da jeg taber dette problem lige nu.


Machine Specs
Windows XP SP3
Intel core i5 3.2GHz
3.5 GB RAM


Kode


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);
}

Bedste reference