将DataTable异步拆分为多个数据表

时间:2016-06-02 12:25:15

标签: c# asynchronous datatable

关于如何将相当大的DataSet批处理为多个分块的DataSet,有很多答案。

但是,如果没有在分块这些数据集时锁定UI,有关如何执行此操作的解决方案并不是真的。

此解决方案有效,但我应该await async操作,但我不知道在此代码中要等待什么,因此操作同步执行:< / p>

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

如何让它以异步方式执行而不是同步执行?

1 个答案:

答案 0 :(得分:2)

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

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

如果您只需要在执行此操作时不保留UI线程,那么当您从UI事件处理程序调用此方法时,您需要做的就是使用线程池线程:

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
    ...
}

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