日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#在新建線程中使用Timer無效問題及解決_C#教程

作者:小葉要學習 ? 更新時間: 2022-10-08 編程語言

在新建線程中使用Timer無效

在C#winform窗體設計中,我們像重復運行某一功能時,我們想到的就是使用C#的Timer控件,但如果這個功能執行一次需要較長時間時,就會占用UI線程,從而會出現窗體上的控件無法選中或點擊。這個問題可以通過多線程來解決,但在多線程中,會出現timer控件無效的問題。

首先,我們在窗體設計頁面上選擇的timer控件,是屬于System.Windows.Forms.Timer類,這個類是無法在開辟的新線程中使用的。

若想在thread中使用,我們要用到System.Timers.Timer類的timer定時器,具體操作如下。

第一步

添加System.Timers.Timer模塊和線程模塊

using System.Timers;
using System.Threading;

第二步

新建一個?System.Timers類的timer定時器和新線程

// 新建一個System.Timers類的定時器
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 100; // 定時器的運行周期(ms)
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); // 添加調用函數
 
void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // 定時器執行的語句
}
 
Thread t1 = new Thread(new ThreadStart(t1_Run)); // 實例化新線程
t1.Start();
 
private void t1_Run()
{
    timer2.Enabled = true; // 定時器開啟
}

C# Timer無法停止的解決

在用Winform做一個網絡爬蟲的時候發現C#里頭Timer調用Stop()函數卻無停止的問題。

在網上找,似乎說問題與線程池有關。我對線程的使用很不熟練,所以也看不明白網上調用線程的方法。

還好在一篇帖子的回復里找到了一個簡單的解決方法,就是在Elapse調用的方法里一開始就調用timer.stop(),結尾再調用一次timer.start();

問題果然解決了

public void main(){
? ? myTimer = new System.Timer.Timer(LOOP_INTERVAL);
? ? myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myElapse);
? ? myTimer.Enabled = true; //myTimer啟動
}
public void myElapse(object sender, System.Timers.ElapsedEventArgs e){
? ? myTimer.Stop();
? ? ...
? ? myTimer.Start();
}

原文鏈接:https://blog.csdn.net/yty2545340913/article/details/123096886

欄目分類
最近更新