C# 将数据表异步拆分为多个数据表

C# 将数据表异步拆分为多个数据表,c#,asynchronous,datatable,C#,Asynchronous,Datatable,关于如何将一个相当大的数据集批处理成多个分块数据集,有很多答案 然而,对于如何在对这些数据集进行分块时不锁定UI的情况下实现这一点,并没有真正的解决方案 此解决方案可行,但我应该等待异步操作,但我不知道在这段代码中等待什么,因此操作同步执行: internal static class ExtensionMethods { internal static async Task<List<DataTable>> CloneTable(DataTable tableT

关于如何将一个相当大的数据集批处理成多个分块数据集,有很多答案

然而,对于如何在对这些数据集进行分块时不锁定UI的情况下实现这一点,并没有真正的解决方案

此解决方案可行,但我应该等待
异步操作,但我不知道在这段代码中等待什么,因此操作同步执行:

internal static class ExtensionMethods
{
    internal static async Task<List<DataTable>> CloneTable(DataTable tableToClone, int countLimit)
    {
        List<DataTable> tables = new List<DataTable>();
        int count = 0;
        DataTable copyTable = null;
        foreach (DataRow dr in tableToClone.Rows)
        {
            if ((count++ % countLimit) == 0)
            {
                copyTable = new DataTable();
                copyTable = tableToClone.Clone();
                copyTable.TableName = "TableCount" + count;
                tables.Add(copyTable);
            }
            copyTable.ImportRow(dr);
        }
        return tables;
    }
}
内部静态类扩展方法
{
内部静态异步任务克隆表(DataTable tableToClone,int countLimit)
{
列表表=新列表();
整数计数=0;
DataTable copyTable=null;
foreach(tableToClone.Rows中的数据行dr)
{
如果((计数+++%countLimit)==0)
{
copyTable=新数据表();
copyTable=tableToClone.Clone();
copyTable.TableName=“TableCount”+计数;
tables.Add(copyTable);
}
copyTable.ImportRow(dr);
}
返回表;
}
}

如何使其异步执行而不是同步执行?

此方法似乎不执行任何IO操作,并且当前以同步方式运行。因此,我建议您将其切换回正常的同步方法,即使其具有以下签名:

internal static List<DataTable> CloneTable(DataTable tableToClone, int countLimit)

顺便说一句,
CloneTable
目前不是一种扩展方法,因为您没有在
tableToClone
变量之前使用
this
关键字。

如果您希望使用异步来提高效率,另一种方法是使用Parallel.ForEach进行表处理:我建议您去读一下关于async/await的内容好吗?您发布的方法将只同步运行,因为其中没有等待代码。@DavidG:我在一系列其他调用中使用async/await。我只是在这个特殊情况下遇到了一些问题,因为没有IO操作:)我不知道我必须在我的类型/对象之前指定一个
this
关键字,才能使它符合扩展方法的条件。我的印象是,
这个
被用来指向当前范围内的一个成员,这就是为什么我没有真正使用它。谢谢你的课:)不客气。您可以阅读有关扩展方法的内容。
public async void button1_Click(object sender, EventArgs e)
{
    //Execute CloneTable on a thread-pool thread
    var tables = await Task.Run(() => ExtensionMethods.CloneTable(table, 4));

    //Use the tables here. This code will run on the UI thread
    //so you can access any UI elements here
    ...
}