C# 应用程序调用web服务时Windows资源管理器未响应

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的冲击,但

我有一个作为服务运行的.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);
}