C# 如何在添加1分钟延迟的情况下将数据表拆分为多个表
我知道与此相关的问题和解决方案很多。但我不明白。我有一个记录数据表C# 如何在添加1分钟延迟的情况下将数据表拆分为多个表,c#,linq,datatable,C#,Linq,Datatable,我知道与此相关的问题和解决方案很多。但我不明白。我有一个记录数据表8000,将来还会增加。我想将它拆分为每个表1000条记录,然后添加一分钟的延迟。下面是我的代码 DataTable dt = util.getReading(); if (dt != null && dt.Rows.Count > 0) { totalRec = dt.Rows.Count; string ReqEnvPath = System.Configurat
8000
,将来还会增加。我想将它拆分为每个表1000条记录,然后添加一分钟的延迟。下面是我的代码
DataTable dt = util.getReading();
if (dt != null && dt.Rows.Count > 0)
{
totalRec = dt.Rows.Count;
string ReqEnvPath = System.Configuration.ConfigurationManager.AppSettings["ReadEnvPath"].ToString();
XElement SoapReqEnv = XElement.Load(ReqEnvPath);
foreach (DataRow dr in dt.Rows)
{
//string uniqueID = dr["UNIQ_KEY"].ToString();
string uniqueID = dr["uniqueid"].ToString();
string meterNo = dr["msn"].ToString();
//APPLICATION_NO, REF_NO, XMETER_NO, METER_SERIAL_NO, KWH_METER_STATUS
string timestamp = DateTime.UtcNow.ToString("o");
StringBuilder sbArg0 = new StringBuilder();
try
{
sbArg0.AppendFormat(@"<?xml version=""1.0"" encoding=""UTF-8"" ?> " + SoapReqEnv.ToString(), uniqueID, startTS, endTS, timestamp, this.HEXURL, this.HEXUID, this.HEXPWD);
Guid currentGuid = Guid.NewGuid();
obj.getResponseAsync(sbArg0.ToString(), currentGuid + "$" + uniqueID);
obj.getResponseCompleted += this.myHandler;
string delayMS = System.Configuration.ConfigurationManager.AppSettings["DelayMS"].ToString();
ushort delay = 1000;
ushort.TryParse(delayMS, out delay);
System.Threading.Thread.Sleep(delay);
}
catch (Exception ex)
{
error += "Error for UniqID:" + uniqueID + "Desc:" + ex.Message + "\n";
}
finally
{
//System.Threading.Thread.CurrentThread.Join();
}
}
}
现在我有4张表,每5行一张。我想从第一个表进程中获取数据,然后等待1分钟,然后获取第二个拆分表,依此类推
我试图将splitdt
传递到foreach(splitdt.Rows中的DataRow)
中,但它给了我一个错误
我怎样才能做到呢
非常感谢您的帮助我希望这就是您想要实现的目标:
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading;
公共无效测试()
{
DataTable bigDataTable=GetBigDataTable();
var splitedTables=新列表();
var smallTable=新数据表();
int page=1;
int pageSize=1000;
列出结果;
while(true)
{
results=bigDataTable.AsEnumerable().Skip(pageSize*page++).Take(pageSize).ToList();
如果(!results.Any())
打破
smallTable=results.CopyToDataTable();
splitedTables.Add(smallTable);
线程睡眠(1000*60*1);
}while(results.Any());
}
要使其工作,您需要添加对的引用
在SO中也是类似的问题。我希望这就是您想要实现的目标:
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading;
公共无效测试()
{
DataTable bigDataTable=GetBigDataTable();
var splitedTables=新列表();
var smallTable=新数据表();
int page=1;
int pageSize=1000;
列出结果;
while(true)
{
results=bigDataTable.AsEnumerable().Skip(pageSize*page++).Take(pageSize).ToList();
如果(!results.Any())
打破
smallTable=results.CopyToDataTable();
splitedTables.Add(smallTable);
线程睡眠(1000*60*1);
}while(results.Any());
}
要使其工作,您需要添加对的引用
在SO中也是类似的问题。那么我说得对吗,您想处理1000行,并延迟1分钟,然后继续处理接下来的1000行?正如我所知,您无法在for each循环中更改(删除/插入行)datatable内容。您希望将列表拆分为一个小的列表块。1分钟的延迟有点不清楚为什么。。也许您可以每分钟处理一个子列表,而不是停止一个线程1分钟。一个简单的计时器,每X一次勾选一次,将列表中的第一个子列表删除。不清楚您是否在拆分或等待时遇到问题。因为至少有5种方法可以分开,3种方法可以等待,这是很多可能的答案。请注意,如果将问题分成两部分,我们有两个完全相同的问题。最好的方法是每分钟查询一次事件数据库,并在开始时间和结束时间之间获得结果。因此,您可以设置并计时每10秒触发一次的事件,然后在分钟数更改时查询前一分钟的事件数据库。我不会将记录限制为1000条,而是将所有记录限制为1分钟的时间跨度。我会让xml输出文件名包含时间,以便更容易提取数据。那么,我是对的,您想处理1000行并延迟1分钟,然后继续下一个1000行吗?正如我所知,您无法在for each循环中更改(删除/插入行)datatable内容。您希望将列表拆分为一个小的列表块。1分钟的延迟有点不清楚为什么。。也许您可以每分钟处理一个子列表,而不是停止一个线程1分钟。一个简单的计时器,每X一次勾选一次,将列表中的第一个子列表删除。不清楚您是否在拆分或等待时遇到问题。因为至少有5种方法可以分开,3种方法可以等待,这是很多可能的答案。请注意,如果将问题分成两部分,我们有两个完全相同的问题。最好的方法是每分钟查询一次事件数据库,并在开始时间和结束时间之间获得结果。因此,您可以设置并计时每10秒触发一次的事件,然后在分钟数更改时查询前一分钟的事件数据库。我不会将记录限制为1000条,而是将所有记录限制为1分钟的时间跨度。我将使xml输出文件名包含时间,以便更容易提取数据。
public void Test()
{
DataTable bigDataTable = GetBigDataTable();
var splitedTables = new List<DataTable>();
var smallTable = new DataTable();
int page = 1;
int pageSize = 1000;
List<DataRow> results;
while (true)
{
results = bigDataTable.AsEnumerable().Skip(pageSize * page++).Take(pageSize).ToList();
if (!results.Any())
break;
smallTable = results.CopyToDataTable();
splitedTables.Add(smallTable);
Thread.Sleep(1000 * 60 * 1);
} while (results.Any());
}