一、C#中如何讓兩個timer控制元件同時執行
Timer,其實是使用了執行緒的非同步呼叫,既然執行緒可以併發,那麼Timer是可以同時呼叫Start()的。
二、靜態函式與非靜態函式
查不同貼子,找到 下面不同解說,我認為,不同方面各有道理:
解說一:在載入時機和佔用記憶體上,靜態方法和例項方法是一樣的,在型別第一次被使用時載入。呼叫的速度基本上沒有差別
如果一個方法與他所在類的例項物件無關,那麼它就應該是靜態的,而不應該把它寫成例項方法。
靜態方法和例項化方式的區分是為了解決模式的問題。
解說二:靜態只是少了一次構造而已 沒有什麼誰高誰低
只是有些類 這個類他在世界上不具備很多實體物件,那就是這麼一個類
比如數學方面的計算,你需要建立多個物件嗎? 不需要 他就在那 所以靜態。
而人 則需要動態建立 很多人 每個人都不一樣
解說三:靜態就象做燒餅,先做好了賣的時候直接賣,賣的時候省事。非靜態有點像做煎餅,做一個買一個,不糟踐。
解說四:有點差別 是例項方法的第一個引數是 this指標,靜態方法沒有this指標引數
解說五:物件的例項化指的是物件資料的例項化,而不是物件本身的例項化
也就是建立一個物件,需要例項化的是物件的資料,而不是物件的成員方法
不管什麼物件在記憶體都是通過程式碼段和資料段來分開儲存的,這兩個東西是分開的,所謂的物件導向只是對使用者的展現形式,並不是系統底層的真是情況,對cpu來說沒有任何的物件,只有程式碼和資料。
所以物件的方法本身在記憶體中只有一個副本,不管是否建立物件的例項始終存在與程式的程式碼空間
靜態方法不需要建立類的例項即可直接呼叫
例項方法需要依賴類的例項才能呼叫,呼叫前增加了建立例項的開銷,如果不考慮物件的建立(比如物件只建立一次),則呼叫靜態方法和例項方法的速度是一樣的。
三、類靜態變數
在類中定義公共靜態變數,在記憶體中固定地址,不會變,不用例項化。可以一次賦值後長時間儲存。值供不同類間使用都可以。
若在類中定義普通公共變更,則用的時候需要例項化此類,這些每一次例項化都會在記憶體中開闢一個新地址和空間以供使用,每次例項化就相當於新的變數,需要新賦值。
四、Oracle批量入庫
用update 或blukcopy。
update示例:
DataTable dt2 = new DataTable();
OracleDataAdapter da = new OracleDataAdapter();
da.SelectCommand = new OracleCommand();
da.SelectCommand.Connection = DbService.GetOracleConn();
da.SelectCommand.CommandType = CommandType.Text;
da.SelectCommand.CommandText = "select * from cmn_t_position_history where 1=2";
try
{
da.Fill(dt2);
foreach (DataRow dr in dt.Rows)
{
dt2.Rows.Add();
int count = dt2.Rows.Count;
dt2.Rows[count - 1]["device_type"] = dr["device_type"].ToString();
dt2.Rows[count - 1]["device_id"] = dr["device_id"].ToString();
dt2.Rows[count - 1]["location_time"] = Convert.ToDateTime(dr["location_time"].ToString());
dt2.Rows[count - 1]["location_x"] = dr["location_x"].ToString();
dt2.Rows[count - 1]["location_y"] = dr["location_y"].ToString();
dt2.Rows[count - 1]["def_location_x"] = dr["def_location_x"].ToString();
dt2.Rows[count - 1]["def_location_y"] = dr["def_location_y"].ToString();
}
OracleCommandBuilder ocb = new OracleCommandBuilder(da);
try
{
num = da.Update(dt2);
if (num > 0)
{
sb.Clear();
sb.AppendFormat("update cmn_position_info set s_flag='{0}' where s_flag='{1}'", "1", "0");
msg = DbService.ExecuteSqliteSql(sb.ToString());
}
}
catch (SQLiteException ex)
{
LogHelper.LogHelper.RecordLog(0, ex.Message);
return ex.Message;
}
blukcopy示例:
OracleBulkCopy bulkCopy = new OracleBulkCopy(connstr, OracleBulkCopyOptions.Default);
bulkCopy.DestinationTableName = "CMN_T_POSITION_HISTORY";
bulkCopy.BatchSize = dt_cj_zflocation.Rows.Count;
try
{
if (dt_cj_zflocation != null && dt_cj_zflocation.Rows.Count != 0)
bulkCopy.WriteToServer(dt_cj_zflocation);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (bulkCopy != null)
bulkCopy.Close();
}