C# 多線程之通過Timer開啟線程的例子

来源:https://www.cnblogs.com/arcticfish/archive/2020/02/14/12305999.html
-Advertisement-
Play Games

本例通過Timer的tick()方法觸發TimerCallback委托來開闢新的線程,線程中的具體工作通過一個靜態方法作為參數給TimerCallback委托。 using System; using System.Threading; /* 這是一個關於 timer開啟多線程的一個例子 * 1.T ...


 

本例通過Timer的tick()方法觸發TimerCallback委托來開闢新的線程,線程中的具體工作通過一個靜態方法作為參數給TimerCallback委托。

using System;
using System.Threading;

/* 這是一個關於 timer開啟多線程的一個例子  
 * 1.Timer 的tick事件觸發系統內置委托TimerCallback委托。而此委托會觸發一個新的線程 。此線程中需要完成的具體的工作寫成一個靜態方法。作為參數傳遞給這個委托。
 * 2.如果是用Timer觸發的線程會自動開始不需要用到.Start()來啟動
 * 3.如果沒有使用線程池threadpool 那麼有多少個線程系統都會全部執行 這樣的話如果線程太多那就使系統不停地線上程間切換會消耗大量時間。所以說線程太多時一定要
 *    用一個線程池來管理 這樣就可以提高效率
 * 4.雖然timer是在主線程中創建並開始運行的, 但是主線程暫停卻並不影響timer的tick事件的按時觸發,比如本例中主線程設置睡眠5秒,但是並沒有影響timer.tick事件觸發
 * 5.所有timer創建的線程都是後臺線程 即 線程的.isbackground=true;
 * 6.用戶不創建線程池 系統是不會自己創建的。
 * 7.Timer.Change(Timeout.Infinite,Timeout.Infinite) 則是取消Timer的重覆性勞動等待下次啟用。 
 * 參數1:Timer每一次觸發執行回調前需等待時間,0立即觸發,Timeout.Infinite永不觸發回調;
 * 參數2:表示每次觸發timer的間隔時間,0表示只執行一次即第一次。              
 */


namespace TimerCreateThread
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主線程開始執行********************* 線程ID" + Thread.CurrentThread.ManagedThreadId);
            TimerCallback delegate_tcb = new TimerCallback(ToDoSamething);//實例化一個可以創建新線程的內置委托--TimerCallback 。具體做的事寫成一個靜態方法作為參數傳入委托。
            Timer timer = new Timer(delegate_tcb, null, 3000,2000); //把這個委托作為參數傳遞進去,timer開啟後tick延遲3秒, 之後每2秒執行一次tick()事件,而此事件就會觸發TimerCallback委托。一下就要新建一個線程

            int j = 0;
            while (j <3)
            {
                Console.WriteLine("主線程正在執行********************* 線程ID" + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(4000); //主線程休眠不會影響tick執行 因為我設置的tick時間為2秒 ,而主線程要睡4秒 //證明 雖然timer是在主線程中進行的 但是 主線程暫停卻並不影響timer的tick事件的按時觸發
                j++;
            }
            timer.Change(Timeout.Infinite, Timeout.Infinite);//完成上面的while迴圈後執行此句時鐘停止。Timer就不再通過tick激發委托創建新線程 時間為4000*3=12秒。此時就不會觸發新的線程 但已經觸發的線程不會結束 。不管是否正在執行還是正在等待
            //timer.Dispose();//不建議使用銷毀。因為一旦銷毀就不能再重啟時間觸發器 
            Console.WriteLine("線程池已滿,不再開闢新的線程");
            Console.ReadKey();
        }

        //具體工作內容寫入這個靜態方法
        static void ToDoSamething(object i)
        {
            Thread.CurrentThread.IsBackground = false;
            Console.WriteLine("此線程正在執行,線程ID" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(10000);//模擬線程執行 需要10秒時間 。Timeout.Infinite無限長
            Console.WriteLine("執行完成,線程ID" + Thread.CurrentThread.ManagedThreadId);

        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.用字典映射代替switch case語句 if/else可以代替switch但是非常不合適。 用字典代替switch: day = 5 switcher = { 0:'Sunday', 1:'Monday', 2:'Tuesday' } day_name = switcher.get(day,' ...
  • 我一直想用 Python and Selenium 創建一個網頁爬蟲,但從來沒有實現它。 幾天前, 我決定嘗試一下,這聽起來可能是挺複雜的, 然而編寫代碼從 Unsplash 抓取一些美麗的圖片還是挺容易的。 PS:很多人在學習Python的過程中,往往因為遇問題解決不了或者沒好的教程從而導致自己放 ...
  • 作為非專業的python選手,或者非專業的爬蟲選手,即使我們有一些編程基礎,有時想通過代碼從網上獲取一些信息,也不能徒手就能做,需要借鑒一些成熟的方案、代碼。 ...
  • 前言 亂碼是我們在程式開發中經常碰到且讓人頭疼的一件事,尤其是我們在做javaweb開發,如果我們沒有清楚亂碼產生的原理,碰到亂碼問題了就容易摸不著頭腦,無從下手。 亂碼主要出現在兩部分,如下: 第一,瀏覽器通過表單提交到後臺,如果表單內容有中文,那麼後臺收到的數據可能會出現亂碼。 第二,後端伺服器 ...
  • 資源訪問介面 由於JDK提供的資源訪問類並不能很好的滿足底層資源的訪問需求,所以Spring設計了一個Resource介面。Spring框架使用Resource裝載各種資源,包括配置文件資源、國際化屬性文件資源等 Resource具體的實現類圖 Resource介面的主要方法 1. boolean ...
  • "CodeForces Gym題目頁面傳送門" 有$1$個$n1\times m1$的字元矩陣$a$和$1$個$n2\times m2$的字元矩陣$b$,求$a,b$的最大公共子矩陣。輸出這個最大公共子矩陣的行數、列數和左上角分別在$a,b$中的坐標。若無解,輸出$``\text{0 0''}$。若 ...
  • 1,分頁嘛先要有個SQL 程式才能寫下去 先提供下SQL的思路,對於分頁的SQL我之前帖子有介紹,就不一一介紹了 select top pageSize * --顯示數量 from (select row_number() over(order by EG_ID asc) as rownumber, ...
  • 昨天看新聞,說人教社開放了人教版中小學教材電子版的春季教材(下載地址:http://bp.pep.com.cn/jc/ ),就想著給兒子全下載下來以備後用。不過人工下載真是麻煩枯燥,就為了省事,就寫個爬蟲。原本打算用python,回頭想了下,好久沒用C#了,就用C#寫吧。 具體思路和實現步驟如下 1 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...