public static void reCallTaskScheduler()
        {
            var dt = getListTaskSchedulerWait();

            if (dt.Rows.Count == 0)
            {
                return;
            }
            try
            {
                DataRow r    = dt.Rows[0];
                var     key  = Enum.Parse(typeof(keyFunction), $"{r["function"]}", true);
                var     args = new itemScheduler();
                /*cols = "iduser,action,function,typeprocess,idObject,packetsize,listfile,request,times";*/
                args.action   = $"{r["action"]}";
                args.function = (keyFunction)key;
                if (args.function == keyFunction.Other)
                {
                    dt.Rows.RemoveAt(0);
                    dt.WriteXml(Folders.App_Data + "\\taskscheduler.xml", XmlWriteMode.WriteSchema);
                    reCallTaskScheduler();
                    return;
                }
                args.listFile = $"{r["listfile"]}";
                if (args.function == keyFunction.ExecTSQL)
                {
                    /* Format ListFile TSQL: NewLine + Go + NewLine */
                    if (string.IsNullOrEmpty(args.listFile))
                    {
                        dt.Rows.RemoveAt(0);
                        dt.WriteXml(Folders.App_Data + "\\taskscheduler.xml", XmlWriteMode.WriteSchema);
                        reCallTaskScheduler();
                        return;
                    }
                    var s = Regex.Matches(args.listFile, "[\n]go[\n]");
                    var a = new List <string>();
                    for (int i = 0; i < s.Count; i++)
                    {
                        a.Add(s[i].Value);
                    }
                    args.data = a;
                }
                args.idObject    = $"{r["idObject"]}";
                args.idUser      = $"{r["iduser"]}";
                args.packetSize  = int.Parse($"{r["packetsize"]}");
                args.request     = $"{r["request"]}";
                args.times       = DateTime.Parse($"{r["times"]}");
                args.typeProcess = $"{r["typeprocess"]}";
                args.callTaskScheduler();
                dt.Rows.RemoveAt(0);
                dt.WriteXml(Folders.App_Data + "\\taskscheduler.xml", XmlWriteMode.WriteSchema);
            }
            catch (Exception ex) { ex.save(); }
        }
 private static void actionOther(itemScheduler args)
 {
     if (args.data is Action)
     {
         Progressbar p = new Progressbar(args.action, args.action);
         p.message = $"{args.idUser}: processing ..";
         local.taskList.Add(p);
         var obj = args.data as Action;
         try { obj(); } catch (Exception ex) { ex.save(); }
         local.taskList.Remove(p);
     }
 }
        public static string callThread(this HttpSessionStateBase s, string action, string request = "", string list = "", int packetsize = 1000, Action obj = null)
        {
            var args = new itemScheduler();

            args.idUser     = s.getIdUser();
            args.action     = action;
            args.packetSize = 1000;
            args.listFile   = list;
            args.times      = DateTime.Now;
            args.request    = request;
            args.data       = obj;
            return(args.callTaskScheduler());
        }
 public static void ExecTSQL(itemScheduler args)
 {
     if (args.data is List <string> )
     {
         Progressbar p = new Progressbar(args.action, args.action);
         p.message = $"{args.idUser}: processing ..";
         local.taskList.Add(p);
         var obj = args.data as List <string>;
         using (var db = local.getDataObject())
         {
             try
             {
                 foreach (var v in obj)
                 {
                     db.Execute(v);
                 }
             }
             catch (Exception ex) { ex.save(); }
         }
         local.taskList.Remove(p);
         reCallTaskScheduler();
     }
 }
        private static void bulkCopyTableFromAccess(this Models.SQLServerDataContext db, string fileName, string tableName, itemScheduler args, ref int countRow, ref List <string> msgError, string where = "", string fromTable = "")
        {
            var cols = new List <string>();
            var dt   = db.getDataSet($"select top 1 * from {tableName}").Tables[0];

            foreach (DataColumn c in dt.Columns)
            {
                cols.Add(c.ColumnName);
            }
            string col = $"[{string.Join("],[", cols)}]";
            var    f   = new FileInfo(fileName);
            var    acc = new access(f.FullName, "");

            local.taskList.Modify(args.action, $"{f.Name}-{tableName}: {countRow:#,0} processed ..");
            if (string.IsNullOrEmpty(fromTable))
            {
                fromTable = tableName;
            }
            string tsql = $"select {col} from {fromTable}{(string.IsNullOrEmpty(where) ? "" : " where " + where)};";
            var    r    = acc.reader(tsql);

            try
            {
                if (r.HasRows == false)
                {
                    r.Close(); acc.close(); return;
                }
                dt = new DataTable(tableName);
                foreach (var item in cols)
                {
                    dt.Columns.Add(item);
                }
                local.taskList.Modify(args.action, $"{f.Name}-{tableName}: {countRow:#,0} processed ..");
                while (r.Read())
                {
                    if (dt.Rows.Count >= args.packetSize)
                    {
                        dt.bulkCopy(local.connectionstring, tableName);
                        countRow += dt.Rows.Count;
                        dt        = new DataTable(tableName);
                        foreach (var item in cols)
                        {
                            dt.Columns.Add(item);
                        }
                        local.taskList.Modify(args.action, $"{f.Name}-{tableName}: {countRow:#,0} processed ..");
                    }
                    DataRow row = dt.NewRow();
                    foreach (var item in cols)
                    {
                        row[item] = $"{r[item]}";
                    }
                    dt.Rows.Add(row);
                }
                if (dt.Rows.Count > 0)
                {
                    dt.bulkCopy(local.connectionstring, tableName);
                    countRow += dt.Rows.Count;
                    dt        = new DataTable(tableName);
                    local.taskList.Modify(args.action, $"{f.Name}-{tableName}: {countRow:#,0} processed ..");
                }
                r.Close();
                acc.close();
            }
            catch (Exception ex)
            {
                try { r.Close(); } catch { }
                acc.close();
                msgError.Add($"{DateTime.Now:HH:mm:ss}-{f.Name}-{tableName}: " + ex.saveMessage());
                local.taskList.Modify(args.action, $"{msgError[msgError.Count - 1]}");
            }
        }
        public static void importExcel(itemScheduler args)
        {
            args.times = DateTime.Now;
            var p = new Progressbar(args.action)
            {
                message = "Kiểm tra dữ liệu đầu vào"
            };
            int  rowProcessed = 0;
            bool flagContinue = true;
            var  db           = local.getDataObject();
            var  actions      = new List <Action>();
            var  msgError     = new List <string>();
            var  cols         = new List <string>()
            {
                "iduser", "action"
            };
            string wImport = $"iduser=N'{args.idUser.getValueField()}' and [action]=N'{args.action}'";
            string tImport = keyTable.importData + "2";

            for (int index = 0; index < 57; index++)
            {
                cols.Add($"f{index}");
            }
            var dt = new DataTable(tImport); foreach (var v in cols)

            {
                dt.Columns.Add(v);
            }

            /* Excel */
            p.name = $"{args.idUser} Import Excel";
            local.taskList.Add(p);
            actions.Add(() =>
            {
                local.taskList.Modify(args.action, "Reset Import Excel ..");
                db.Execute($"delete from {tImport} where {wImport};");
            });
            char separator = ','; if (args.listFile.Contains("|"))

            {
                separator = '|';
            }

            foreach (var filename in args.listFile.Split(separator))
            {
                actions.Add(() =>
                {
                    var f = new FileInfo(filename);
                    local.taskList.Modify(args.action, $"{f.Name}: {rowProcessed:#,0} processed ..");
                    var xls = new OleDbConnection(excel.getConnectionString(filename, false));
                    try
                    {
                        var r = xls.ExcelReader();
                        dt    = new DataTable(tImport); foreach (var v in cols)
                        {
                            dt.Columns.Add(v);
                        }
                        string val = "";
                        while (r.Read())
                        {
                            if (dt.Rows.Count >= args.packetSize)
                            {
                                try
                                {
                                    dt.bulkCopy(local.connectionstring, tImport);
                                    rowProcessed += dt.Rows.Count;
                                    local.taskList.Modify(args.action, $"{f.Name}: {rowProcessed:#,0} processed ..");
                                }
                                catch (Exception ex)
                                {
                                    var s = ex.saveMessage();
                                    if (s.Contains("Column 'madvi'") == false)
                                    {
                                        msgError.Add($"{DateTime.Now:HH:mm:ss}-{f.Name}: " + s);
                                    }
                                    local.taskList.Modify(args.action, $"{s}");
                                }
                                dt = new DataTable(tImport); foreach (var v in cols)
                                {
                                    dt.Columns.Add(v);
                                }
                            }
                            DataRow row = dt.NewRow();
                            row[0]      = args.idUser;
                            row[1]      = args.action;
                            for (int index = 0; index < (r.FieldCount >= dt.Columns.Count ? dt.Columns.Count : r.FieldCount); index++)
                            {
                                val = $"{r[index]}".Trim(); if (val.Length > 500)
                                {
                                    val = val.Substring(0, 499).Trim();
                                }
                                row[index + 2] = val;
                            }
                            dt.Rows.Add(row);
                        }
                        if (dt.Rows.Count > 0)
                        {
                            try
                            {
                                dt.bulkCopy(local.connectionstring, tImport);
                                rowProcessed += dt.Rows.Count;
                                local.taskList.Modify(args.action, $"{f.Name}: {rowProcessed:#,0} processed ..");
                            }
                            catch (Exception ex)
                            {
                                var s = ex.saveMessage();
                                msgError.Add($"{DateTime.Now:HH:mm:ss}-{filename.Substring(Folders.pathApp.Length)}: " + s);
                                local.taskList.Modify(args.action, $"{s}");
                            }
                            dt = new DataTable(tImport);
                        }
                        r.Close();
                    }
                    catch (Exception ex)
                    {
                        msgError.Add($"{DateTime.Now:HH:mm:ss}-{filename.Substring(Folders.pathApp.Length)}: " + ex.saveMessage());
                        local.taskList.Modify(args.action, $"{msgError[msgError.Count - 1]}");
                    }
                    xls.Dispose();
                });
            }
            if (actions.Count > 0)
            {
                int index = 0;
                local.taskList.setValueMax(args.action, actions.Count);
                /* Lưu quá trình tiến trình */
                local.setHistoryTaskList(local.taskList[args.action], $"{args.idUser}", requeststring: args.request);
                foreach (var action in actions)
                {
                    try
                    {
                        action();
                        if (flagContinue == false)
                        {
                            break;
                        }
                        index++;
                        local.taskList.Modify(args.action, "", index);
                    }
                    catch (Exception ex)
                    {
                        msgError.Add(ex.saveMessage($"Index: {index} - {local.taskList[args.action].message}"));
                    }
                }
                /* Lưu kết quả tiến trình */
                var t  = DateTime.Now - p.timeStart;
                var rs = $"Time Processed: {t.Hours}:{t.Minutes}:{t.Seconds}; {string.Join("; ", msgError)}";
                local.setHistoryTaskList(local.taskList[args.action], $"{args.idUser}", rs);
            }
            db.Dispose();
            local.taskList.Remove(p);
            reCallTaskScheduler();
        }
        public static string callTaskScheduler(this itemScheduler args)
        {
            bool waitrun = false;

            /* Khung giờ chỉ dành cho đồng bộ dữ liệu vào cập nhật phiên bản */
            if (local.taskList[args.action] != null)
            {
                if (args.function == keyFunction.Other)
                {
                    return($"Tiến trình {args.action} đang chạy. Không thể thao tác. Vui lòng chờ tiến trình kết thúc");
                }
                waitrun = true;
            }
            else
            {
                if (local.taskList.Count() > 0)
                {
                    var obj = new List <keyFunction>()
                    {
                        keyFunction.importCV93, keyFunction.ExecTSQL, keyFunction.importExcel, keyFunction.importTGLaoDong
                    };
                    if (obj.Contains(args.function))
                    {
                        waitrun = true;
                    }
                }
            }
            if (waitrun)
            {
                /* phân tích args cho phép thêm nhiều, lưu lại xml ghi nhớ */
                var path = new FileInfo(Folders.App_Data + "\\taskscheduler.xml");
                var dt   = new DataTable("taskscheduler");
                try { dt.ReadXml(path.FullName); }
                catch { }
                if (dt.Rows.Count == 0)
                {
                    var cols = "iduser,action,function,typeprocess,idObject,packetsize,listfile,request".Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    dt = new DataTable("taskscheduler");
                    foreach (var v in cols)
                    {
                        dt.Columns.Add(v);
                    }
                    dt.Columns.Add("times", typeof(DateTime));
                }
                //var dv = new DataView(dt, $"iduser='******' and action='{args.action}'", "action", DataViewRowState.CurrentRows);
                dt.Rows.Add(args.idUser, args.action, $"{args.function}", args.typeProcess, args.idObject, args.packetSize, args.listFile, args.request.Replace(",", ", "), args.times);
                dt.WriteXml(path.FullName, XmlWriteMode.WriteSchema);
                return($"Đã thêm hàng đợi tiến trình xử lý. <a href=\"/task\" alt=\"Tiến trình\">Chuyển sang mục tiến trình để biết thông tin chi tiết</a>");
            }
            Thread t;

            try
            {
                if (args.function == keyFunction.Other)
                {
                    t = new Thread(new ThreadStart(() => actionOther(args)));
                }
                else
                {
                    var mi = (typeof(taskScheduler)).GetMethod($"{args.function}");
                    t = new Thread(new ThreadStart(() => mi.Invoke(null, new object[] { args })));
                }
                t.Start();
                return("Đã thêm vào tiến trình xử lý. <a href=\"/task\" alt=\"Tiến trình\">Chuyển sang mục tiến trình để theo dõi quá trình thao tác</a>");
            }
            catch (Exception ex) { return(ex.Message); }
        }