主頁 > .NET開發 > 震驚!Windows Service服務和定時任務框架quartz之間原來是這種關系……

震驚!Windows Service服務和定時任務框架quartz之間原來是這種關系……

2020-09-13 11:28:16 .NET開發

過場CG:   接到公司領導的檔案指示,“小熊”需要在6月底去海外執行一個行動代號為【定時任務】的營救計劃,這個計劃關系到公司某個專案的生死(資料安全漏洞),作戰部擬定兩個作戰方案:   方案一:使用務定時任務框架quartz;   方案二:使用windows Service服務,   最終的作戰方案為:兩者配套使用,

  前言:專案開發完成后,對接的專案有很多個模塊,由于其中的一個環節疏忽,現在需要在原有的基礎上把缺失的資料自動寫入資料庫存盤起來, 重新修改程式邏輯已然不現實,現在需要一個補丁來進行邏輯更正, 補丁邏輯:兩個入口控制,
  • 入口一:點擊【更新】按鈕同步邏輯后的資料;
  • 入口二:每天晚上18:00進行執行同步邏輯后的資料;

  現在我們先使用window服務進行入口二的撰寫(入口一只需要一個按鈕呼叫入口二的邏輯即可) windows服務

一、開發環境

作業系統:Windows 7 X64/32

開發環境:VS2017

編程語言:C#

.NET版本:.NET Framework 4.6.1

二、創建Windows Service

1、新建一個Windows Service,并將專案名稱改為“MyWindowsService”,如下圖所示:

 

 2、在解決方案資源管理器內將Service1.cs改為MyWindowsService.cs后并在左邊頁面空白處點擊滑鼠右鍵,添加安裝程式,如下圖所示:

 

添加安裝程式:

 

 

3、 此時軟體會生成兩個組件,分別為“serviceInstaller1”及“serviceProcessInstaller1”,點擊“serviceInstaller1”,右鍵--->屬性,

將ServiceName改為MyWindowsService,Description改為“我的服務”,如下圖:

 

 

 4、點擊“serviceProcessInstaller1”,在“屬性”表單將Account改為LocalSystem(服務屬性系統級別),如下圖所示:

     5、點擊MyWindowsService.cs,在左邊空白位置右鍵,“查看代碼”,然后撰寫代碼,代碼我撰寫好了,直接拷貝即可使用  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MyWindowsService
{
    public partial class MyWindowsService : ServiceBase
    {
        public MyWindowsService()
        {
            InitializeComponent();
        }

        //創建行程
        public static Thread threadStartConfirmActualTime;  //創建一個時間行程
        public static Thread threadDoCheck;                 //檢查日志時間行程

        //開啟服務
        protected override void OnStart(string[] args)
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t服務啟動!\n");
            StartServer();
        }

        //停止服務
        protected override void OnStop()
        {
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t服務停止!\n");
        }

        //啟動服務操作
        private void StartServer()
        {
            try
            {
                threadStartConfirmActualTime = new Thread(new ThreadStart(new SingleClass().BeginConfirmMessageTime));//在行程下面創建執行緒
                threadStartConfirmActualTime.Start();
                threadDoCheck.Start();
            }
            catch (Exception ex)
            {
                threadStartConfirmActualTime.Abort();//關閉執行緒
                Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t服務停止!"+ex.Message+"\n");
            }
        }


        /// <summary>
        /// Aouth:xiongze
        /// Time:2020/06/02
        /// Details:單例模式_建立一個單例類,保證只有一個物件被實體化,然后開啟服務
        /// </summary>
        public class SingleClass  //單例模式_建立一個單例類,保證只有一個物件被實體化
        {
            public static SingleClass _SingleClass;
            public static object onlock = new object();  //實體化一個鎖

            public static SingleClass Singleton
            {
                get
                {
                    if (_SingleClass == null)
                    {
                        lock (onlock)
                        {
                            _SingleClass = new SingleClass();
                        }
                    }
                    return _SingleClass;
                }
            }
            public void BeginConfirmMessageTime()  //開啟服務
            {
                while (true)
                {
                    //每天晚上18這一個小時內檢測執行
                    if (DateTime.Now.Hour.ToString("18") == "18")
                    {
                        try
                        {
                            //同步資料
                            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "我在"+ DateTime.Now + "同步了資料哦!\n");
                        }
                        catch (Exception ex)
                        {
                            //記錄錯誤日志(記錄到相應的檔案下面)
                            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t我是錯誤日志!" + ex.Message + "\n");
                        }
                    }
                    Thread.Sleep(1800000);  //半個小時執行一次,注意,1000毫秒=1秒,具體需要多少時間可以自由換算 1800000半小時
                }

            }
        }

    }
}
  6、至此,Windows服務已經創建完畢,    三、創建安裝、啟動、停止、卸載服務的Windows表單   1、點擊專案,右鍵,重新生成 在桌面上創建一個檔案夾,命名為“我的服務”,將MyWindowsService專案專案生成的bin檔案夾Debug檔案夾的內容全部復制到新建的檔案夾里面; 然后去百度拷貝三個檔案到“我的服務”檔案里面,分別為Install.bat(安裝)、UnInstall.bat(卸載)、InstallUtil.exe(執行), 打開檔案,分別打開Install.bat和UnInstall.bat檔案,將后面一個xxx.exe修改為你的檔案程式,我們的是MyWindowsService.exe,如下圖

 

 

 

 

操作完后雙擊Install.bat進行安裝windows服務,安裝成功后點擊【計算機】-->右鍵-->管理-->服務里面找到“我的服務”,啟動服務并修改為自動啟動;如下圖:  

 

 

 

 

 這樣就實作了windows服務入口二每天晚上18:00進行執行同步邏輯后的資料,只要代碼不報錯就一直執行;   優點:每天指定時間自動執行指定邏輯 缺點:程式在每次設定的時間內無限執行,消耗資源(CPU等)    
 quartz定時任務
 

一、開發環境

作業系統:Windows 7 X64

開發環境:VS2017

編程語言:C#

.NET版本:.NET Framework 4.6.1

二、創建quartz定時任務 1、創建一個控制臺任務程式進行演示,命名為MyQuartz,創建如下:  

 

 2、引入quartz框架元件

在NuGet管理里面搜索quartz進行安裝,注意:Quartz高版本的存在兼容性,建議使用低版本的(2.5.0) 如下圖:  

 

 

3、創建一個執行的類,用于執行后臺資料邏輯,命名為TestJob,并且繼承Quartz框架的IJob介面,這個累的內容如下,可以直接拷貝
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyQuartz
{
    public class TestJob: IJob
    {
        public void Execute(IJobExecutionContext context)//指定呼叫的方法
        {
            try
            {
                //在這里寫代碼(寫自己的業務邏輯)
                Console.WriteLine("任務執行啦" + DateTime.Now);
            }
            catch (Exception ex)
            {
                Console.WriteLine("定時任務出錯" + ex.Message);
            }
        }
    }
}

4、在Program.cs檔案里面進行呼叫撰寫,撰寫內容主要如下:

  1. 創建一個作業調度池;
  2. 創建出來一個具體的作業;
  3. 創建并配置一個觸發器;
  4. 加入作業調度池中;
  5. 開始運行,
 首先我們看完成代碼,然后進行講解(代碼可以直接拷貝):
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyQuartz
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.首先創建一個作業調度池
            ISchedulerFactory schedf = new StdSchedulerFactory();
            IScheduler sched = schedf.GetScheduler();
            //2.創建出來一個具體的作業
            IJobDetail job = JobBuilder.Create<TestJob>().Build();
            //3.創建并配置一個觸發器

            #region(使用SimpleTrigger觸發器,每次3秒執行一次,無上限)
            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(int.MaxValue)).Build();
            #endregion

            #region 每3秒執行一次 總共5次 ,開始執行時間設定在當前時間,結束時間我設定在2小時后,不過5次執行完沒2小時候都不再執行,
            //-------NextGivenSecondDate:如果第一個引數為null則表名當前時間往后推遲2秒的時間點,
            //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(5), 2);
            //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 3);
            //ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
            //                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(5))
            //                            .Build();
            #endregion

            #region (使用CronTrigger觸發器)在每小時的第10,20,25,26,33,54分鐘,每分鐘的第1,10,14秒執行一次
            //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);
            //ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)
            //                            .WithCronSchedule("1,10,59 10,20,21,26,33,54 * * * ? ")
            //                            .Build();
            #endregion
            //4.加入作業調度池中
            sched.ScheduleJob(job, trigger);
            //5.開始運行
            sched.Start();
            Console.ReadKey();

        }
    }
}

 

在上面代碼中可以看出,我們主要使用了兩個觸發器:SimpleTrigger觸發器和CronTrigger觸發器;

SimpleTrigger觸發器(簡單觸發器SimpleTrigger)

SimpleTrigger可以滿足的調度需求是:在具體的時間點執行一次,或者在具體的時間點執行,并且以指定的間隔重復執行若干次,比如,你有一個trigger,你可以設定它在2015年1月13日的上午11:23:54準時觸發,或者在這個時間點觸發,并且每隔2秒觸發一次,一共重復5次,

根據描述,你可能已經發現了,SimpleTrigger的屬性包括:開始時間、結束時間、重復次數以及重復的間隔,這些屬性的含義與你所期望的是一致的,只是關于結束時間有一些地方需要注意,

重復次數,可以是0、正整數,以及常量SimpleTrigger.REPEAT_INDEFINITELY,重復的間隔,必須是0,或者long型的正數,表示毫秒,注意,如果重復間隔為0,trigger將會以重復次數并發執行(或者以scheduler可以處理的近似并發數),

如果你還不熟悉DateBuilder,了解后你會發現使用它可以非常方便地構造基于開始時間(或終止時間)的調度策略,

endTime屬性的值會覆寫設定重復次數的屬性值;比如,你可以創建一個trigger,在終止時間之前每隔10秒執行一次,你不需要去計算在開始時間和終止時間之間的重復次數,只需要設定終止時間并將重復次數設定為REPEAT_INDEFINITELY(當然,你也可以將重復次數設定為一個很大的值,并保證該值比trigger在終止時間之前實際觸發的次數要大即可),

 

具體用法我們就不水文了,大家去看Quartz官網檔案的用法即可SimpleTrigger觸發器使用規則:https://www.w3cschool.cn/quartz_doc/quartz_doc-67a52d1f.html,部分截圖顯示如下:
  • 指定時間開始觸發,不重復:
  • 指定時間觸發,每隔10秒執行一次,重復10次:
  • 5分鐘以后開始觸發,僅執行一次:
  • 立即觸發,每個5分鐘執行一次,直到22:00:
  • 建立一個觸發器,將在下一個小時的整點觸發,然后每2小時重復一次:

 

 

CronTriggerr觸發器(基于Cron運算式的觸發器CronTriggerr

CronTrigger通常比Simple Trigger更有用,如果您需要基于日歷的概念而不是按照SimpleTrigger的精確指定間隔進行重新啟動的作業啟動計劃,

使用CronTrigger,您可以指定號時間表,例如“每周五中午”或“每個作業日和上午9:30”,甚至“每周一至周五上午9:00至10點之間每5分鐘”和1月份的星期五“,

即使如此,和SimpleTrigger一樣,CronTrigger有一個startTime,它指定何時生效,以及一個(可選的)endTime,用于指定何時停止計劃,

Cron Expressions
Cron-Expressions用于配置CronTrigger的實體,Cron Expressions是由七個子運算式組成的字串,用于描述日程表的各個細節,這些子運算式用空格分隔,并表示:

Seconds
Minutes
Hours
Day-of-Month
Month
Day-of-Week
Year (optional field)
一個完整的Cron-Expressions的例子是字串“0 0 12?* WED“ - 這意味著”每個星期三下午12:00“,
單個子運算式可以包含范圍和/或串列,例如,可以用“MON-FRI”,“MON,WED,FRI”或甚至“MON-WED,SAT”代替前一個(例如“WED”)示例中的星期幾欄位,
通配符(' '字符)可用于說明該欄位的“每個”可能的值,因此,前一個例子的“月”欄位中的“”字符僅僅是“每個月”,因此,“星期幾”欄位中的“*”顯然意味著“每周的每一天”,
所有欄位都有一組可以指定的有效值,這些值應該是相當明顯的 - 例如秒和分鐘的數字0到59,數小時的值0到23,日期可以是1-31的任何值,但是您需要注意在給定的月份中有多少天!月份可以指定為0到11之間的值,或者使用字串JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV和DEC,星期幾可以指定為1到7(1 =星期日)之間的值,或者使用字串SUN,MON,TUE,WED,THU,FRI和SAT,
'/'字符可用于指定值的增量,例如,如果在“分鐘”欄位中輸入“0/15”,則表示“每隔15分鐘,從零開始”,如果您在“分鐘”欄位中使用“3/20”,則意味著“每隔20分鐘,從三分鐘開始” - 換句話說,它與“分鐘”中的“3,243,43”相同領域,請注意“ / 35”的細微之處并不代表“每35分鐘” - 這意味著“每隔35分鐘,從零開始” - 或者換句話說,與指定“0,35”相同,
'' 字符是允許的日期和星期幾欄位,用于指定“無特定值”,當您需要在兩個欄位中的一個欄位中指定某個字符而不是另一個欄位時,這很有用,請參閱下面的示例(和CronTrigger JavaDoc)以進行說明,
“L”字符允許用于月日和星期幾欄位,這個角色對于“最后”來說是短暫的,但是在這兩個領域的每一個領域都有不同的含義,例如,“月”欄位中的“L”表示“月的最后一天” - 1月31日,非閏年2月28日,如果在本周的某一天使用,它只是意味著“7”或“SAT”,但是如果在星期幾的領域中再次使用這個值,就意味著“最后一個月的xxx日”,例如“6L”或“FRIL”都意味著“月的最后一個星期五”,您還可以指定從該月最后一天的偏移量,例如“L-3”,這意味著日歷月份的第三個到最后一天,當使用'L'選項時,重要的是不要指定串列或值的范圍,因為您會得到混亂/意外的結果,
“W”用于指定最近給定日期的作業日(星期一至星期五),例如,如果要將“15W”指定為月日期欄位的值,則意思是:“最近的平日到當月15日”,
''用于指定本月的“第n個”XXX作業日,例如,“星期幾”欄位中的“63”或“FRI#3”的值表示“本月的第三個星期五”,
以下是一些運算式及其含義的更多示例 - 您可以在JavaDoc中找到更多的org.quartz.CronExpression

Cron Expressions示例
CronTrigger示例1 - 創建一個觸發器的運算式,每5分鐘就會觸發一次
“0 0/5 * * *?”

CronTrigger示例2 - 創建觸發器的運算式,每5分鐘觸發一次,分鐘后10秒(即上午10時10分,上午10:05:10等),
“10 0/5 * * *?”

CronTrigger示例3 - 在每個星期三和星期五的10:3011:3012:30和13:30創建觸發器的運算式,
“0 30 10-13?* WED,FRI“

CronTrigger示例4 - 創建觸發器的運算式,每個月5日和20日上午8點至10點之間每半小時觸發一次,請注意,觸發器將不會在上午10點開始,僅在8:008:309:00和9:300 0/30 8-9 5,20 *?”

請注意,一些調度要求太復雜,無法用單一觸發表示 - 例如“每上午9:00至10:00之間每5分鐘,下午1:00至晚上10點之間每20分鐘”一次,在這種情況下的解決方案是簡單地創建兩個觸發器,并注冊它們來運行相同的作業,

 

具體使用方法見CronTrigger觸發器使用規則:https://www.w3cschool.cn/quartz_doc/quartz_doc-lwuv2d2a.html

  • 建立一個觸發器,每隔一分鐘,每天上午8點至下午5點之間:
  • 建立一個觸發器,將在上午10:42每天發射:
  • 建立一個觸發器,將在星期三上午10:42在TimeZone(系統默認值)之外觸發:

 

 

 


執行演示

寫完后我們查看執行結果,我使用的是SimpleTrigger觸發器,每3秒執行一次,無上限,各位可以根據自身的專案需求更改使用不同的觸發器

 

 

注意:

如果定時任務框架quartz這個掛在iis上會被回收掉(默認是20分鐘)

Quartz高版本的存在兼容性,建議使用低版本的(2.5.0)

 


 

總結

到這里Windows Service服務和定時任務框架quartz都簡單的介紹完了,具體使用哪一個或者配套使用就看本身專案邏輯了;

現在執行的邏輯:

Windows Service服務:程式隨電腦開機啟動,每隔半個小時執行一次,檢測到執行時間等于我設定的時間就去執行后臺邏輯;

定時任務框架quartz:如果發布在iis上,默認20分鐘后會被回收(程式不能一直等待執行),程式處于休眠狀態,到指定時候后喚醒(觸發器)程式執行后臺邏輯;

 

PS:如果把quartz結合windows服務使用的話就不存在被回收問題;

 
歡迎關注訂閱我的微信公眾平臺【熊澤有話說】,更多好玩易學知識等你來取
作者:熊澤-學習中的苦與樂
公眾號:熊澤有話說
出處: https://www.cnblogs.com/xiongze520/p/13031944.html
創作不易,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文鏈接,  

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/24016.html

標籤:C#

上一篇:HTTPS實戰運用

下一篇:C# 擴展TaskScheduler實作獨立執行緒池,支持多任務批量處理,互不干擾,無縫兼容Task

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more