C Thread與委託實現定時重新整理資料功能
阿新 • • 發佈:2018-12-21
使用者需求:定時抓取ERP系統條碼已掃描未稽核單據
- 1
解決辦法: 由於採用Timer控制元件會消耗系統資源,故採用執行緒處理。 由於執行緒呼叫方法不支援控制元件處理模式,故採用委託方法實現。
bool bStop; public DataTable dt = new DataTable(); public ScanedNotChecked_Frm() { InitializeComponent(); } private void ScanedNotChecked_Frm_Load(object sender, EventArgs e) { //定義執行緒 Thread LogThread = new Thread(new ThreadStart(DoService)); //設定執行緒為後臺執行緒,那樣程序裡就不會有未關閉的程式了 LogThread.IsBackground = true; bStop = true; if (bStop == true) { Control.PageControl.CheckForIllegalCrossThreadCalls = false ; LogThread.Start();//起執行緒 } } private string GetList() { SqlParameter[] parms = new SqlParameter[0]; DBCon db = new DBCon("ZM"); gdScanedNotChecked.DataSource = SqlHelper.ExecuteDataset(db.StringConnection(), CommandType.StoredProcedure, "DZ_ScanedNotChecked" , parms).Tables[0]; return "過載"; } int i = 0; private void DoService() { while (true) { bStop = false; //別的執行緒裡的呼叫哇~ i++; lblMessage.Text = "第" + i.ToString() + "次" + returnList(returnMylist) + "資料"; System.Threading.Thread.Sleep(1000*60*5); } } private delegate string returnStrDelegate(); //搞個最簡單滴取值滴方法~ private string returnMylist() { return GetList(); } //判斷一下是不是該用Invoke滴~,不是就直接返回~ private string returnList(returnStrDelegate myDelegate) { if (this.InvokeRequired) { return (string)this.Invoke(myDelegate); } else { return myDelegate(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60