Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在添加1分钟延迟的情况下将数据表拆分为多个表_C#_Linq_Datatable - Fatal编程技术网

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