关于如何将相当大的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;
}
}
如何让它以异步方式执行而不是同步执行?
答案 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
关键字。