定時任務 Wpf.Quartz.Demo.5 (升級版)

来源:https://www.cnblogs.com/akwkevin/archive/2019/03/19/10557749.html
-Advertisement-
Play Games

老規矩:先把全部源碼上傳,見本文底部。 相對於Demo3的區別,就是能自動載入繼承了IJob的任務,任務主體程式分離。 在exe執行文件的同級下建一個MyJobs的文件夾,每次會自動掃描該文件夾下的Job,添加到系統中來。 舉例如下:現在有兩個在系統中的任務。 複製一個編譯好的Job dll文件放在 ...


老規矩:先把全部源碼上傳,見本文底部。

相對於Demo3的區別,就是能自動載入繼承了IJob的任務,任務主體程式分離。

在exe執行文件的同級下建一個MyJobs的文件夾,每次會自動掃描該文件夾下的Job,添加到系統中來。

 

舉例如下:現在有兩個在系統中的任務。

複製一個編譯好的Job dll文件放在MyJobs  按下工具菜單欄中的掃描,會有一個新增的任務出現。(是不影響其它正在執行的任務哦)

 

好了,圖貼完,現在將下麵幾個技術要點。

1. 動態載入dll

IRun getRun;

        public void NewRun<T>() where T:IJob
        {
            getRun = new SimpleRunner<T>();
        }
try
            {
                string dir = System.AppDomain.CurrentDomain.BaseDirectory + "MyJobs";
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }

                DirectoryInfo TheFolder = new DirectoryInfo(dir);
                foreach (FileInfo fi in TheFolder.GetFiles())//遍歷文件夾下所有文件
                {
                    string extension = Path.GetExtension(fi.FullName);//擴展名 ".aspx"
                    if (extension == ".dll")
                    {
                        #region 獲取jobs
                        string path = fi.FullName;//dir + "\\Wpf.Quart.MyJobs.dll";
                        Assembly asm = Assembly.LoadFile(path);

                        //Assembly asm = Assembly.GetExecutingAssembly();
                        Type[] types = asm.GetTypes();

                        foreach (Type t in types)
                        {
                            if (new ArrayList(t.GetInterfaces()).Contains(typeof(IJob)))
                            {
                                IJob job = ObjectUtils.InstantiateType<IJob>(t);
                                if (job != null)
                                {
                                    MethodInfo mi = this.GetType().GetMethod("NewRun").MakeGenericMethod(new Type[] { t });
                                    mi.Invoke(this, null);

                                    IRun run = getRun;
                                    if (TaskRuns.Where(p => p.GetType() == run.GetType()).Count() > 0)
                                    {
                                        continue;
                                    }


                                    if (run != null)
                                    {
                                        if (localRuns != null)
                                        {
                                            var localRun = localRuns.Where(p => p.Name == run.Name).FirstOrDefault();
                                            if (localRun != null)
                                            {
                                                CopyHelper.LeftCopyRight(run, localRun);
                                            }
                                        }
                                        if (run.TriggerState != TriggerState.Normal || run.Mode == Mode.Hand)
                                        {
                                            run.TriggerState = TriggerState.None;
                                        }
                                        run.CronSecondSet.Init();
                                        run.CronMinuteSet.Init();
                                        run.CronHourSet.Init();
                                        run.CronDaySet.Init();
                                        run.CronMonthSet.Init();
                                        run.CronWeekSet.Init();
                                        run.CronYearSet.Init();
                                        run.LogOut = this.LogOut;
                                        run.IsEdit = false;
                                        TaskRuns.Add(run);
                                    }
                                }
                            }
                        }
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                log.Fatal(ex);
            }

二.分離出幾個關鍵的介面放到另一個庫中,需要實現的任務載入那個dll庫就行。主要用來顯示的,如果你的任務不用顯示,那麼可以不需要這幾個介面,直接繼承IJob就行

public class JobHelper
    {
        public static IJobRun GetRun(IJobExecutionContext context)
        {
            JobDataMap data = context.JobDetail.JobDataMap;

            IJobRun Run = data.Get("Runner") as IJobRun;
            if (Run != null)
            {
                Run.GetNextRunTimes();
            }
            return Run;
        }
    }
JobHelper
 public interface IJobRun
    {
        string CronExpression { get; set; }
        TriggerState TriggerState { get; set; }
        string SettingStr { get; set; }
        DateTime? StartTime { get; set; }
        DateTime? EndTime { get; set; }
        DateTime? NextRunTime { get; }
        DateTime[] NextRunTimes { get; set; }
        void GetNextRunTimes();
        void Info(string message);
        void DEBUG(string message);
        void ERROR(string message);
        void FATAL(string message);
        void WARN(string message);
    }
IJobRun

三.具體任務的簡單例子

public class MyHelloJobEx : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync("HelloJob is executing.");
            var Run = JobHelper.GetRun(context);
            if (Run != null)
            {
                Run.Info("HelloJob is executing.");
            }
        }
    }

//JobHelper主要是來界面顯示日誌,獲取下次任務執行時間。不需要,可以不用。
View Code

最後補充一下,水平不足,有點亂,抱歉。

 

源碼下載地址:鏈接:https://pan.baidu.com/s/15UD5oMia8REnYVtJE4_xHA
提取碼:pexq

 


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

-Advertisement-
Play Games
更多相關文章
  • 第1節. 關鍵字 馳騁工作流引擎 流程快速開發平臺 workflow ccflow jflow 第2節. 流程中途結束設計 一條流程走到一定的步驟後,當前的節點有權利停止該流程向下運動,但是他不能把流程刪除掉,該數據仍然需要保存起來,這種操作叫結束流程。 結束流程與刪除流程不同的是: 1,結束流程數 ...
  • 前言 我們學習任何一個新框架時,肯定都需要學習它的子頁面用法,因為子頁面是封裝公共內容最好的容器。 在Xamarin裡子頁面為Fragment,翻譯過來是片段的意思。 Fragment 下麵我們來學習Fragment的用法。 首先創建一個類MenuFragment繼承Fragment;然後重寫他的O ...
  • 使用反射和動態生成代碼兩種方式(Reflect和Emit) 反射將DataTable轉為List方法 1 public static List<T> ToListByReflect<T>(this DataTable dt) where T : new() 2 { 3 List<T> ts = ne ...
  • 右鍵解決方案,添加引用--> System.Configuration.dll 在exe.config 中添加數據 讀取添加的配置數據 ...
  • 問題描述: 項目在本地運行不報錯,上傳到 GitHub 之後,再 clone 到本地,執行: npm install 安裝完成之後再執行: npm run dev 這時報錯 Error: No PostCSS Config found in... 本以為是 GitHub 上傳的問題,後開又試了兩回, ...
  • 很多企業和個人的網站上線後,一直不被百度、搜狗、谷歌等搜索引擎收錄網頁,但仔細查看網站,網站已經有很多的文章內容了,即使再保持頻繁的更新,網站依舊未被這些搜索引擎收錄頁面,這對於企業網站或者個人網站來說是不好的,相當於別人無法通過搜索查找到你網站的信息。在這個環節可能是你的網站SEO方面以及網站運維 ...
  • 這周其實突然感覺焦慮有點蔓延。主要是隨便上招聘網站、培訓網站、開發類新聞網,.Net的身影已經越來越少了,並不一定說是要貶低.net,而是這些年他的職業前景確實不太光鮮。一線主流企業的核心場景都不用.net的,或者只是被當成備胎,要不是這兩年微軟的開源政策有所改觀,市場有點動靜,否則連備胎都當不成。 ...
  • 簡介:本文是一個簡單的demo用於展示利用StackExchange.Redis和Log4Net構建日誌隊列,為高併發日誌處理提供一些思路。 0、先下載安裝Redis服務,然後再服務列表裡啟動服務(Redis的預設埠是6379,貌似還有一個故事)(https://github.com/Micros ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...