C# 动态线程如何帮助解决我的性能问题

C# 动态线程如何帮助解决我的性能问题,c#,asp.net,C#,Asp.net,使用的.NET框架:3.5和 Visual Studio 2008 我有一个在不同数据库上执行某些更新的方法 现在我有一个“foreach循环”,其中调用了用于执行数据库更新的函数。循环根据数据库的数量执行。 客户端服务器中可能有700多个数据库。因此循环将执行700次,这需要10个多小时,这是一个很大的性能问题 我们遇到的一个解决方案是动态线程创建 例如:如果我们有100个数据库,然后将其拆分为10个线程,那么具有1到10个数据库的方法将由thread1处理,接下来10到20个数据库调用将由线

使用的.NET框架:3.5和 Visual Studio 2008

我有一个在不同数据库上执行某些更新的方法

现在我有一个“foreach循环”,其中调用了用于执行数据库更新的函数。循环根据数据库的数量执行。 客户端服务器中可能有700多个数据库。因此循环将执行700次,这需要10个多小时,这是一个很大的性能问题

我们遇到的一个解决方案是动态线程创建

例如:如果我们有100个数据库,然后将其拆分为10个线程,那么具有1到10个数据库的方法将由thread1处理,接下来10到20个数据库调用将由线程2处理……就像使用10个线程更新的wise 100数据库一样


任何人都可以帮我解决这个问题。如果你有任何其他合适的想法,请分享…

你可以像这样使用工作线程池

public void DoWork()
{
    // queue in a loop
    System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(YourDatabaseWork));
}

private void YourDatabaseWork(Object state)
{
    // Insert code to perform a long task.
}
通过这种方式,假设不需要太多内存一次完成所有工作,您可以将要执行的每项工作排队。有一定数量的工作线程可用,所有其他线程将放入队列中。因此,您应该能够一次简单地启动所有线程,并且每次完成一个现有工作线程时,都会处理一个新的排队项目

您可以在此处阅读更多内容:

有关如何在需要时使用输入参数,请阅读以下内容:
异步是解决问题的最佳方法。如果您的更新工作是IO绑定的,并且数据库更新命令通常是可用的,那么您的700个线程将在大部分时间都坐在那里等待数据库更新完成。解决方案是异步执行这些更新,然后线程池将有足够多的线程来执行这些更新

您可以同时启动所有更新,然后等待任务完成。如果更新更复杂,并且涉及执行多个查询,请使每个查询异步执行并等待结果。下面是一个使用.net 4.5的简单示例:

public async Task UpdateDatabses(List<string> databses)
{
    List<Task> updateTasks = new List<Task>();

    foreach (var db in databses)
    {
        updateTasks.Add(UpdateDatabase(db));
    }

    // asynchronously wait for all the tasks to complete
    await Task.WhenAll(updateTasks);
}

public async Task UpdateDatabase(string databse)
{
    await /* Update the database */
}
然后,您应该能够将代码更改为以下内容:

    public Task UpdateDatabses(List<string> databses)
    {
        List<Task> updateTasks = new List<Task>();

        foreach (var db in databses)
        {
            updateTasks.Add(UpdateDatabase(db));
        }

        return Extensions.WhenAll(updateTasks);
    }

    public Task UpdateDatabase(string databse)
    {
        return null;  /* Update the database using a Task returninng asynchronous operation*/
    }

谢谢老兄。让我看看我能不能从中解脱出来。谢谢你Ned Stoyanov。我们正在使用.NET frame work 3.5。这个解决方案可以应用于.NET frame work 3.5吗?你仍然可以使用.NET 3.5的TPL,但代码必须更改,因为不支持异步等待。我会重做并发布解决方案。谢谢你,奈德。我会试试这个。
    public Task UpdateDatabses(List<string> databses)
    {
        List<Task> updateTasks = new List<Task>();

        foreach (var db in databses)
        {
            updateTasks.Add(UpdateDatabase(db));
        }

        return Extensions.WhenAll(updateTasks);
    }

    public Task UpdateDatabase(string databse)
    {
        return null;  /* Update the database using a Task returninng asynchronous operation*/
    }