【edobnet】利用.Net 執行緒池提高應用程式效能.
最近一直在研究,提高處理效能的方法.
開始利用,多執行緒,非同步的方法來實現,
下面的語句是用來分段進行資料整合, (如按天,或按月,對中間資料進行整合)整合SQL通過批量生成
在單執行緒的執行時間,CPU利用率一般在1-10%,(伺服器HP 580 4 CPU XEON 3.0G 16G記憶體,加盤櫃),這樣整合時間太長。
如果分段整合,CPU利用率就在40-80%得到比較大的利用。
private void button1_Click(object sender, System.EventArgs e)
{
if(folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
System.IO.DirectoryInfo di = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
files = di.GetFiles();
ThreadStart ts = new ThreadStart(start);
Thread thread = new Thread(ts);
thread.Start();
}
}
public delegate string myMethodDelegate( object[] args);
static int t = 0;
void start()
{
foreach(FileInfo file in files)
{
System.IO.StreamReader sr = new StreamReader(file.FullName,System.Text.Encoding.Default);
string txt = sr.ReadToEnd();
sr.Close();
myMethodDelegate ddd= new myMethodDelegate(Work2);
ddd.BeginInvoke(new object[]{txt_connectString.Text,txt,file.FullName},new AsyncCallback(EndWorkBack), null);
Write(string.Format("T:{0}|{1} {1}\r\n",DateTime.Now,file.FullName,t));
//_Task.StartTask(new TaskDelegate(_Task.Work2),new object[]{txt_connectString.Text,txt});
}
}
public string Work2( object[] args)
{
using(SqlConnection conn = new SqlConnection(args[0].ToString()))
{
using(SqlCommand comm = new SqlCommand(args[1].ToString(),conn))
{
comm.CommandTimeout = 60000;
conn.Open();
comm.ExecuteNonQuery();
}
conn.Close();
}
return args[2].ToString();
}
int i =0;
protected void EndWorkBack( IAsyncResult ar )
{
myMethodDelegate ddd = (myMethodDelegate)ar.AsyncState;
string result = ddd.EndInvoke( ar );
i++;
Write(string.Format("T:{3}:{2}:{0} {1}\r\n",result,DateTime.Now,i,t));
}
public void Write(string msg)
{
System.IO.StreamWriter sw = new StreamWriter("C:\\install.log",true,System.Text.Encoding.Default);
sw.WriteLine(msg);
sw.Close();
}
不過上面程式也有一點問題,就是非同步執行緒資料沒有好的控制。如果同時執行執行緒,過多,CPU時間片分配就不合理,執行速度反而慢。
後來就一直想用執行緒池的來合理處理執行緒。
。Net自帶的執行緒池使用起來比較簡單。
通過System.Threading.ThreadTool類就可以使用,
定義回撥方法
WaitCallback async = new WaitCallback(FExeute);
通過ThreadPool.QueueUserWorkItem(async,service);加入佇列
回撥方法執行運算
{
//myResetEvent.WaitOne();
using(TG_EvaluteBaseDatasSet service = (TG_EvaluteBaseDatasSet)Param)
{
service.doResult();
writeFile(Path,service) ;
OnTgReport(new ReportEvent(service.TE_PASS_RANGE,service.TE_YEAR,service.TE_MONTH,int.Parse(service.TE_I_E_FLAG),int.Parse(service.TE_ENTRY_TYPE)));
}
Interlocked.Decrement(ref number);
//number--;
}
其中Interlocked.Decrement,是呼叫原子操作,進行減操作,
Interlocked.Increment(ref number);是呼叫原子操作,進行加
原子操作在多執行緒中不會有衝突。
執行緒池有幾點好處,
1。多執行緒執行,
2。根據CPU個數,效能等,合理安排執行的執行緒,(在實際操作過程中,通過SQL SERVER企業管理器中檢視當前活動的程式數,可以看到當前正在執行的執行緒數)
3。非同步操作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-349323/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [.net 物件導向程式設計進階] (18) 多執行緒(Multithreading)(三) 利用多執行緒提高程式效能(下)物件程式設計執行緒thread
- [.net 物件導向程式設計進階] (17) 多執行緒(Multithreading)(二) 利用多執行緒提高程式效能(中)物件程式設計執行緒thread
- [.net 物件導向程式設計進階] (16) 多執行緒(Multithreading)(一) 利用多執行緒提高程式效能(上)物件程式設計執行緒thread
- Java利用執行緒工廠監控執行緒池Java執行緒
- 用windbg檢查.NET執行緒池設定執行緒
- Netty原始碼解析一——執行緒池模型之執行緒池NioEventLoopGroupNetty原始碼執行緒模型OOP
- 記憶體池、程式池、執行緒池記憶體執行緒
- 詳談執行緒池的理解和應用執行緒
- .NET多執行緒程式設計(4):執行緒池和非同步程式設計 (轉)執行緒程式設計非同步
- Android程式框架:執行緒與執行緒池Android框架執行緒
- Python執行緒池與程式池Python執行緒
- 程式池、執行緒池效率測試執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒
- 執行緒和執行緒池執行緒
- 多執行緒【執行緒池】執行緒
- 執行緒 執行緒池 Task執行緒
- 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐執行緒
- netty原始碼分析-執行緒池Netty原始碼執行緒
- 執行緒池執行緒
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- Java多執行緒——執行緒池Java執行緒
- Nginx引入執行緒池 效能提升9倍Nginx執行緒
- Nginx 引入執行緒池,提升 9 倍效能Nginx執行緒
- 使用多執行緒提高rest服務效能執行緒REST
- golang執行緒池在IO多路複用中的應用Golang執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒
- 執行緒池以及四種常見執行緒池執行緒
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- 【JUC】4-FutrueTask結合執行緒池的應用執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 二. 執行緒管理之執行緒池執行緒
- kuangshenshuo-多執行緒-執行緒池執行緒
- 執行緒的建立及執行緒池執行緒
- JavaThread多執行緒執行緒池Javathread執行緒
- Java多執行緒18:執行緒池Java執行緒
- 多執行緒之手撕執行緒池執行緒