本事例以oracle为测试 TASK、Thread、Parallel.ForEach三种方法实现
Task是依赖于CPU的,如果你的CPU是多核的,Task效率相对要高些
如果是单核的,Task没有什么优势
using DataBaseTest.DataBase; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.Caching; using System.Diagnostics; using System.Data.Entity.Infrastructure; using System.Threading; using System.IO; using Oracle.ManagedDataAccess.Client; using System.Data; using System.Reflection; namespace DataBaseTest { class Program { static private List<BOARD_VEHICLE_DAY_INFOEntity> list = new List<BOARD_VEHICLE_DAY_INFOEntity>(); static void Main(string[] args) { Stopwatch watch = Stopwatch.StartNew(); watch.Start(); var sq1 = @"SELECT T.PASSKEY,T.PLATENO,T.PLATECOLOR,T.SPOTTINGTOTAL,T.PASSING_COUNT,T.PASSINGXTSPOT_MAX_COUNT,NULL AS SPOTTINGPASSINFO,T.TIMESTAGE1,T.TIMESTAGE2,T.TIMESTAGE3,T.TIMESTAGE4,T.TIMESTAGE5,T.TIMESTAGE6,T.TIMESTAGE7,T.TIMESTAGE8,T.TIMESTAGE9,T.TIMESTAGE10,T.TIMESTAGE11,T.TIMESTAGE12,T.TIMESTAGE13,T.TIMESTAGE14,T.TIMESTAGE15,T.TIMESTAGE16,T.TIMESTAGE17,T.TIMESTAGE18,T.TIMESTAGE19,T.TIMESTAGE20,T.TIMESTAGE21,T.TIMESTAGE22,T.TIMESTAGE23,T.TIMESTAGE24,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/2 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/2 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘)"; var sq2 = @"SELECT T.PASSKEY,T.PLATENO,T.PLATECOLOR,T.SPOTTINGTOTAL,T.PASSING_COUNT,T.PASSINGXTSPOT_MAX_COUNT,NULL AS SPOTTINGPASSINFO,T.TIMESTAGE1,T.TIMESTAGE2,T.TIMESTAGE3,T.TIMESTAGE4,T.TIMESTAGE5,T.TIMESTAGE6,T.TIMESTAGE7,T.TIMESTAGE8,T.TIMESTAGE9,T.TIMESTAGE10,T.TIMESTAGE11,T.TIMESTAGE12,T.TIMESTAGE13,T.TIMESTAGE14,T.TIMESTAGE15,T.TIMESTAGE16,T.TIMESTAGE17,T.TIMESTAGE18,T.TIMESTAGE19,T.TIMESTAGE20,T.TIMESTAGE21,T.TIMESTAGE22,T.TIMESTAGE23,T.TIMESTAGE24,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/3 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/3 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘)"; var sq3 = @"SELECT T.PASSKEY,T.PLATENO,T.PLATECOLOR,T.SPOTTINGTOTAL,T.PASSING_COUNT,T.PASSINGXTSPOT_MAX_COUNT,NULL AS SPOTTINGPASSINFO,T.TIMESTAGE1,T.TIMESTAGE2,T.TIMESTAGE3,T.TIMESTAGE4,T.TIMESTAGE5,T.TIMESTAGE6,T.TIMESTAGE7,T.TIMESTAGE8,T.TIMESTAGE9,T.TIMESTAGE10,T.TIMESTAGE11,T.TIMESTAGE12,T.TIMESTAGE13,T.TIMESTAGE14,T.TIMESTAGE15,T.TIMESTAGE16,T.TIMESTAGE17,T.TIMESTAGE18,T.TIMESTAGE19,T.TIMESTAGE20,T.TIMESTAGE21,T.TIMESTAGE22,T.TIMESTAGE23,T.TIMESTAGE24,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/4 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/4 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘)"; DateTime TBstart = Convert.ToDateTime("2019-07-01 00:00:00").Date; List<string> sqllist = new List<string>(); sqllist.Add(sq1); sqllist.Add(sq2); sqllist.Add(sq3); #region TASK实现 #if false Task wt1 = Task.Run(() => { //myOracleConnect.getConn(); //var sq1 = @"SELECT T.PASSKEY,T.PLATENO,T.PLATECOLOR,T.SPOTTINGTOTAL,T.PASSING_COUNT,T.PASSINGXTSPOT_MAX_COUNT,NULL AS SPOTTINGPASSINFO,T.TIMESTAGE1,T.TIMESTAGE2,T.TIMESTAGE3,T.TIMESTAGE4,T.TIMESTAGE5,T.TIMESTAGE6,T.TIMESTAGE7,T.TIMESTAGE8,T.TIMESTAGE9,T.TIMESTAGE10,T.TIMESTAGE11,T.TIMESTAGE12,T.TIMESTAGE13,T.TIMESTAGE14,T.TIMESTAGE15,T.TIMESTAGE16,T.TIMESTAGE17,T.TIMESTAGE18,T.TIMESTAGE19,T.TIMESTAGE20,T.TIMESTAGE21,T.TIMESTAGE22,T.TIMESTAGE23,T.TIMESTAGE24,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/2 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/2 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘)"; //List<BOARD_VEHICLE_DAY_INFOEntity> list1 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sq1, CommandType.Text, null); //list.InsertRange(0, list1); test(sq1); }); Task wt2 = Task.Run(() => { test(sq2); //myOracleConnect.getConn(); //var sq2 = @"SELECT T.PASSKEY,T.PLATENO,T.PLATECOLOR,T.SPOTTINGTOTAL,T.PASSING_COUNT,T.PASSINGXTSPOT_MAX_COUNT,NULL AS SPOTTINGPASSINFO,T.TIMESTAGE1,T.TIMESTAGE2,T.TIMESTAGE3,T.TIMESTAGE4,T.TIMESTAGE5,T.TIMESTAGE6,T.TIMESTAGE7,T.TIMESTAGE8,T.TIMESTAGE9,T.TIMESTAGE10,T.TIMESTAGE11,T.TIMESTAGE12,T.TIMESTAGE13,T.TIMESTAGE14,T.TIMESTAGE15,T.TIMESTAGE16,T.TIMESTAGE17,T.TIMESTAGE18,T.TIMESTAGE19,T.TIMESTAGE20,T.TIMESTAGE21,T.TIMESTAGE22,T.TIMESTAGE23,T.TIMESTAGE24,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/3 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/3 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘)"; //List<BOARD_VEHICLE_DAY_INFOEntity> list2 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sq2, CommandType.Text, null); //list.InsertRange(0, list2); }); Task wt3 = Task.Run(() => { test(sq3); //myOracleConnect.getConn(); //var sq3 = @"SELECT T.PASSKEY,T.PLATENO,T.PLATECOLOR,T.SPOTTINGTOTAL,T.PASSING_COUNT,T.PASSINGXTSPOT_MAX_COUNT,NULL AS SPOTTINGPASSINFO,T.TIMESTAGE1,T.TIMESTAGE2,T.TIMESTAGE3,T.TIMESTAGE4,T.TIMESTAGE5,T.TIMESTAGE6,T.TIMESTAGE7,T.TIMESTAGE8,T.TIMESTAGE9,T.TIMESTAGE10,T.TIMESTAGE11,T.TIMESTAGE12,T.TIMESTAGE13,T.TIMESTAGE14,T.TIMESTAGE15,T.TIMESTAGE16,T.TIMESTAGE17,T.TIMESTAGE18,T.TIMESTAGE19,T.TIMESTAGE20,T.TIMESTAGE21,T.TIMESTAGE22,T.TIMESTAGE23,T.TIMESTAGE24,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/4 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/4 0:00:00‘, ‘YYYY-MM-DD HH24:MI:SS‘)"; //List<BOARD_VEHICLE_DAY_INFOEntity> list3 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sq3, CommandType.Text, null); //list.InsertRange(0, list3); }); var wtasks = new Task[] { wt1, wt2, wt3 }; Task.WaitAll(wtasks); #endif #endregion #region Thread实现 #if false new Thread(() => { test(sq1); }) { IsBackground = true }.Start(); new Thread(() => { test(sq2); }) { IsBackground = true }.Start(); new Thread(() => { test(sq3); }) { IsBackground = true }.Start(); Thread.Sleep(10000); #endif #endregion #region Parallel.ForEach #if false var rnd = new Random(); Parallel.ForEach(sqllist, item => { test(item); int delay; Monitor.Enter(rnd); delay = rnd.Next(1, 1001); Monitor.Exit(rnd); Thread.Sleep(delay); }); #endif #endregion watch.Stop(); Console.WriteLine(string.Format("耗时:{0},数据总数{1}", formatDuring(watch.ElapsedMilliseconds), list.Count)); Console.ReadKey(); } public static void test(string sql) { MyOracleConnect myOracleConnect = new MyOracleConnect(); myOracleConnect.getConn(); List<BOARD_VEHICLE_DAY_INFOEntity> list1 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sql, CommandType.Text, null); list.InsertRange(0, list1); } public static String formatDuring(long mss) { long days = mss / (1000 * 60 * 60 * 24); long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60); long seconds = (mss % (1000 * 60)) / 1000; return days + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒"; } } }
数据连接 数据库引用Oracle.ManagedDataAccess.dll
using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace DataBaseTest { class MyOracleConnect { private OracleConnection conn = null; public void getConn() { string connString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ip)(PORT=1521))" + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));Persist Security Info=True;User ID=用户名;Password=密码;"; conn = new OracleConnection(connString); if (conn != null) { try { conn.Open(); Console.WriteLine("数据库连接成功"); } catch (System.Exception ex) { Console.WriteLine(ex.Message); } } } public void CloseConn() { if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); conn = null; } } public DataTable getSelect(string commandText, params OracleParameter[] param) { DataTable result = new DataTable(); try { using (OracleCommand cmd = new OracleCommand(commandText, conn)) { if (param != null) cmd.Parameters.AddRange(param); try { OracleDataAdapter adapter = new OracleDataAdapter(cmd); adapter.Fill(result); } catch (Exception ex) { result = null; } } } finally { CloseConn(); } return result; } /// <summary> /// 执行返回多条记录的泛型集合对象 /// </summary> /// <typeparam name="T">泛型类型</typeparam> /// <param name="commandText">Oracle语句或存储过程名</param> /// <param name="commandType">Oracle命令类型</param> /// <param name="param">Oracle命令参数数组</param> /// <returns>泛型集合对象</returns> public List<T> ExecuteList<T>(string commandText, CommandType commandType, params OracleParameter[] param) where T : new() { List<T> list = new List<T>(); DataTable dt = new DataTable(); try { using (OracleCommand cmd = new OracleCommand(commandText, conn)) { if (param != null) cmd.Parameters.AddRange(param); try { OracleDataAdapter adapter = new OracleDataAdapter(cmd); adapter.Fill(dt); list = ConvertToModel<T>(dt); } catch (Exception ex) { } } } finally { CloseConn(); } return list; } /// <summary> /// 将DataTable数据源转换成实体类 /// </summary> public List<T> ConvertToModel<T>(DataTable dt) where T : new() { List<T> ts = new List<T>();// 定义集合 foreach (DataRow dr in dt.Rows) { T t = new T(); PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性 foreach (PropertyInfo pi in propertys) { if (dt.Columns.Contains(pi.Name)) { if (!pi.CanWrite) continue; var value = dr[pi.Name]; try { if (value != DBNull.Value && value != null && value.ToString() != "") { if (pi.PropertyType.FullName.ToUpper().Contains("DECIMAL")) { pi.SetValue(t, decimal.Parse(value.ToString()), null); } else if (pi.PropertyType.FullName.ToUpper().Contains("DOUBLE")) { pi.SetValue(t, double.Parse(value.ToString()), null); } else if (pi.PropertyType.FullName.ToUpper().Contains("INT32")) { pi.SetValue(t, int.Parse(value.ToString()), null); } else if (pi.PropertyType.FullName.ToUpper().Contains("INT16")) { pi.SetValue(t, short.Parse(value.ToString()), null); } else pi.SetValue(t, value, null); } } catch (Exception ex) { //throw ex; } } } ts.Add(t); } return ts; } } }
原文:https://www.cnblogs.com/macT/p/11375630.html