跳出三界外,不在五行中的timer: private void button1_Click(object sender, EventArgs e) { System.Timers.Timer t = new System.Timers.Timer(); t.Interval = 1000 * 2; t.Elapsed += delegate { MessageBox.Show(System.DateTime.Now.ToString()); }; t.Start(); } 按完button1按鈕后,,timer持續(xù)運行,每隔約2秒就會彈出一個msgbox顯示當(dāng)前時間,,當(dāng)然,因為我們已經(jīng)失去了t這個變量,,表面上也就無法終止這個timer了(也許有辦法終止吧)。對于這種現(xiàn)象,,我推測是三種原因造成的。一,,timer是對windows內(nèi)核對象的包裝,上面這段托管代碼的底層調(diào)用了來自windows的一些內(nèi)核對象,,在超離作用域的時候,沒有對內(nèi)核對象進(jìn)行相應(yīng)的處理,,當(dāng)然這只是推測,我現(xiàn)在沒有精力去證實,。其二:委托原因。其三 :使用了多線程技術(shù),。 private void button2_Click(object sender, EventArgs e) { System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(delegate() { for (int i = 0; i < 6; i++) { System.Threading.Thread.Sleep(3000); MessageBox.Show("I'm in thread"); } })); t.Start(); MessageBox.Show("end of click"); }
以上兩段代碼,,現(xiàn)象是類似的,我將其稱之為游魂現(xiàn)象——看上變量已經(jīng)死了,,實際上依然存在,原理尚有待研究,。 private void button1_Click(object sender, EventArgs e) { System.Timers.Timer t = new System.Timers.Timer(); t.Interval = 1000 * 2; t.Elapsed += delegate { MessageBox.Show(System.DateTime.Now.ToString()); }; t.Start(); System.Threading.Thread.Sleep(1000 * 20); t.Stop(); } using的法力? private void button4_Click(object sender, EventArgs e) { using (System.Timers.Timer t = new System.Timers.Timer()) { t.Interval = 1000 * 1; t.Elapsed += delegate { MessageBox.Show(System.DateTime.Now.ToString()); }; t.Start(); } System.Threading.Thread.Sleep(1000 * 20); } 2.再看以下代碼
private void button4_Click(object sender, EventArgs e) { using (System.Timers.Timer t = new System.Timers.Timer()) { t.Interval = 1000 * 1; t.Elapsed += delegate { MessageBox.Show(System.DateTime.Now.ToString()); }; t.Start(); System.Threading.Thread.Sleep(1000 * 5); } } private void button3_Click(object sender, EventArgs e)
{ GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); MessageBox.Show("Collect function invok complete."); } |
|