本文继续介绍定时任务 Wpf.Quartz.Demo.3的一些小细节, 代码也请前往第3节下载。

1.RichTextBox右键菜单

<RichTextBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="剪贴" Command="ApplicationCommands.Cut"/>                     
                    <MenuItem Header="复制" Command="ApplicationCommands.Copy"/>                                         
                    <MenuItem Header="粘贴" Command="ApplicationCommands.Paste"/>                                          
                    <MenuItem Header="清除" Click="MenuItemClear_Click"/>   
                    <MenuItem x:Name="menuPause" Header="暂停" Click="MenuItemPause_Click"/>   
                </ContextMenu>
            </RichTextBox.ContextMenu>

其中上面上个是系统默认的,自己要添加,可以自己定义。

2.右键DataGrid,选中该行。

<i:Interaction.Triggers>
                <i:EventTrigger EventName="PreviewMouseRightButtonDown">
                    <local:ExInvokeCommandAction Command="{Binding PreviewMouseRightComamnd}" CommandParameter="{Binding SelectedItem, ElementName=table}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>

private void PreviewMouseRight(object para)
        {
            RoutedEventArgs e = ((ExCommandParameter)para).EventArgs as RoutedEventArgs;
            var treeViewItem = VisualUpwardSearch<UIElement>(e.OriginalSource as DependencyObject) as UIElement;

if (treeViewItem == null) return;
            treeViewItem.Focus();
            e.Handled = true;
        }

private static DependencyObject VisualUpwardSearch<M>(DependencyObject source)
        {
            while (source != null && source.GetType() != typeof(M))
            {
                if (source is Visual || source is Visual3D)
                    source = VisualTreeHelper.GetParent(source);
                else
                    source = LogicalTreeHelper.GetParent(source);
            }
            return source;
        }

3.任务的基本接口,主要是系统的启动,停止等命令

  1. public interface IRun:IBaseRunner
  2. {
  3. [Newtonsoft.Json.JsonIgnore()]
  4. Action<string, LogLevel> LogOut { get; set; }
  5.  
  6. Task Start();
  7.  
  8. Task Stop();
  9.  
  10. Task ReStart();
  11.  
  12. Task Resume();
  13.  
  14. Task Pause();
  15.  
  16. Task RunNowOneTime();
  17. }

IRun

4.任务的设置的接口,主要是任务的配置保存。

  1. public interface IBaseRunner
  2. {
  3. string Name { get; }
  4. string DisplayName { get; set; }
  5. string Remark { get; set; }
  6. string CronExpression { get; set; }
  7. TriggerState TriggerState { get; set; }
  8. string SettingStr { get; set; }
  9. DateTime? NextRunTime { get; }
  10. DateTime[] NextRunTimes { get; set; }
  11. DateTime? StartTime { get; set; }
  12. DateTime? EndTime { get; set; }
  13. bool IsEdit { get; set; }
  14. CronSecondSet CronSecondSet { get; set; }
  15. CronMinuteSet CronMinuteSet { get; set; }
  16. CronHourSet CronHourSet { get; set; }
  17. CronDaySet CronDaySet { get; set; }
  18. CronMonthSet CronMonthSet { get; set; }
  19. CronWeekSet CronWeekSet { get; set; }
  20. CronYearSet CronYearSet { get; set; }
  21. EasyCronSet EasyCronSet { get; set; }
  22. Mode Mode { get; set; }
  23. void Info(string message);
  24. void DEBUG(string message);
  25. void ERROR(string message);
  26. void FATAL(string message);
  27. void WARN(string message);
  28.  
  29. }

IBaseRunner

5.任务类,接口IRun的实现。

  1. using Quartz;
  2. using Quartz.Impl;
  3. using Quartz.Spi;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using Wpf.Quartz.Converters;
  12.  
  13. namespace Wpf.Quartz
  14. {
  15. public class SimpleRunner<T> : BaseRunner,IRun where T : IJob
  16. {
  17. public SimpleRunner()
  18. {
  19. base.Name = this.Name;
  20. }
  21.  
  22. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  23. public new string Name
  24. {
  25. //get { return GetType().Name; }
  26. get { return typeof(T).Name; }
  27. }
  28.  
  29. private readonly SemaphoreSlim locker = new SemaphoreSlim();
  30.  
  31. public virtual async Task Start()
  32. {
  33. if (StatusEnableConverter.IsEanbleState(TriggerState, "Start") == false)
  34. {
  35. return;
  36. }
  37. await locker.WaitAsync();
  38. try
  39. {
  40.  
  41. if (string.IsNullOrEmpty(CronExpression))//如果为空,则设置为立刻执行一次
  42. {
  43. CronExpression = CronHelper.DateTime2Cron(DateTime.Now.AddSeconds());
  44. }
  45. Info((DisplayName ?? Name) + "开始启动!");
  46. TriggerState= await QuartzHelper.Instance.StartJobExecuteByCron<T>(CronExpression, Name, this, this.StartTime, this.EndTime);
  47. Info((DisplayName ?? Name) + "启动完毕!");
  48.  
  49. NextRunTimes = QuartzHelper.Instance.GetNextRunTime(CronExpression, StartTime, EndTime, );
  50. IsEdit = false;
  51. }
  52. catch (Exception ex)
  53. {
  54. log.Fatal(ex);
  55. Info((DisplayName ?? Name) + "启动失败!" + ex.Message);
  56. }
  57. finally
  58. {
  59. TriggerState = await QuartzHelper.Instance.GetJobState(Name);
  60. locker.Release();
  61. }
  62. }
  63.  
  64. public virtual async Task ReStart()
  65. {
  66. if (StatusEnableConverter.IsEanbleState(TriggerState, "ReStart") == false)
  67. {
  68. return;
  69. }
  70. await locker.WaitAsync();
  71. try
  72. {
  73. if (string.IsNullOrEmpty(CronExpression))//如果为空,则设置为立刻执行一次
  74. {
  75. CronExpression = CronHelper.DateTime2Cron(DateTime.Now.AddSeconds());
  76. }
  77. Info(DisplayName??Name + "开始重新启动!");
  78. TriggerState = await QuartzHelper.Instance.RemoveJob(Name);
  79. TriggerState = await QuartzHelper.Instance.StartJobExecuteByCron<T>(CronExpression, Name, this, this.StartTime, this.EndTime);
  80. Info((DisplayName ?? Name) + "重新启动完毕!");
  81.  
  82. NextRunTimes = QuartzHelper.Instance.GetNextRunTime(CronExpression, StartTime, EndTime, );
  83. IsEdit = false;
  84. }
  85. catch (Exception ex)
  86. {
  87. log.Fatal(ex);
  88. Info((DisplayName ?? Name) + "重新启动失败!" + ex.Message);
  89. }
  90. finally
  91. {
  92. TriggerState = await QuartzHelper.Instance.GetJobState(Name);
  93. locker.Release();
  94. }
  95. }
  96.  
  97. public virtual async Task Pause()
  98. {
  99. if (StatusEnableConverter.IsEanbleState(TriggerState, "Pause") == false)
  100. {
  101. return;
  102. }
  103. try
  104. {
  105. Info((DisplayName ?? Name) + "开始暂停!");
  106. TriggerState = await QuartzHelper.Instance.PauseJob(Name);
  107. Info((DisplayName ?? Name) + "暂停完毕!");
  108. }
  109. catch (Exception ex)
  110. {
  111. log.Fatal(ex);
  112. Info((DisplayName ?? Name) + "暂停失败!" + ex.Message);
  113. }
  114. }
  115.  
  116. public virtual async Task Resume()
  117. {
  118. if (StatusEnableConverter.IsEanbleState(TriggerState, "Resume") == false)
  119. {
  120. return;
  121. }
  122. try
  123. {
  124. Info((DisplayName ?? Name) + "开始恢复!");
  125. TriggerState = await QuartzHelper.Instance.ResumeJob(Name);
  126. Info((DisplayName ?? Name) + "恢复完毕!");
  127. }
  128. catch (Exception ex)
  129. {
  130. log.Fatal(ex);
  131. Info((DisplayName ?? Name) + "恢复失败!" + ex.Message);
  132. }
  133. }
  134.  
  135. public virtual async Task Stop()
  136. {
  137. if (StatusEnableConverter.IsEanbleState(TriggerState, "Stop") == false)
  138. {
  139. return;
  140. }
  141. try
  142. {
  143. Info((DisplayName ?? Name) + "开始停止!");
  144. TriggerState = await QuartzHelper.Instance.RemoveJob(Name);
  145. Info((DisplayName ?? Name) + "停止完毕!");
  146. }
  147. catch (Exception ex)
  148. {
  149. log.Fatal(ex);
  150. Info((DisplayName ?? Name) + "停止失败!" + ex.Message);
  151. }
  152. }
  153.  
  154. public virtual async Task RunNowOneTime()
  155. {
  156. if (StatusEnableConverter.IsEanbleState(TriggerState, "Run") == false)
  157. {
  158. return;
  159. }
  160. if (locker.CurrentCount == )
  161. {
  162. Info((DisplayName ?? Name) + "正在执行,请稍后再执行!");
  163. return;
  164. }
  165. await locker.WaitAsync();
  166. try
  167. {
  168. Info((DisplayName ?? Name) + "开始执行一次!");
  169. ISchedulerFactory sf = new StdSchedulerFactory();
  170. IScheduler scheduler = await sf.GetScheduler();
  171. await scheduler.Start();
  172.  
  173. IJobDetail job = await scheduler.GetJobDetail(new JobKey(Name, "group1"));
  174. if (job == null)
  175. {
  176. job = JobBuilder.Create<HelloJob>()
  177. .WithIdentity(Name, "group1")
  178. .Build();
  179. }
  180.  
  181. ITrigger trigger = await scheduler.GetTrigger(new TriggerKey(Name, "group1"));
  182. if (trigger == null)
  183. {
  184. trigger = TriggerBuilder.Create()
  185. .WithIdentity(Name, "group1")
  186. .StartNow()
  187. .WithSimpleSchedule(x => x
  188. .WithIntervalInSeconds())
  189. .Build();
  190. }
  191.  
  192. await scheduler.ScheduleJob(job, trigger);
  193.  
  194. Info((DisplayName ?? Name) + string.Format("执行一次完毕"));
  195.  
  196. //await Task.Delay(TimeSpan.FromSeconds(5));
  197.  
  198. //await scheduler.Shutdown();
  199.  
  200. //SchedulerMetaData metaData = await scheduler.GetMetaData();
  201. //Info(string.Format("执行完毕{0}个任务.", metaData.NumberOfJobsExecuted));
  202.  
  203. }
  204. catch (Exception ex)
  205. {
  206. log.Fatal(ex);
  207. Info((DisplayName ?? Name) + string.Format("执行一次失败") + ex.Message);
  208. }
  209. finally
  210. {
  211. locker.Release();
  212. }
  213. }
  214. }
  215. }

SimpleRunner

6.BaseRunner,主要是设置Cron

  1. using Quartz;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Wpf.Quartz.Models;
  9.  
  10. namespace Wpf.Quartz
  11. {
  12. public class BaseRunner: BaseLog, INotifyPropertyChanged
  13. {
  14. public string Name { get; set;}
  15.  
  16. private string displayName;
  17. public string DisplayName
  18. {
  19. get { return displayName; }
  20. set
  21. {
  22. if (displayName != value)
  23. {
  24. displayName = value;
  25. OnPropertyChanged("DisplayName");
  26. }
  27. }
  28. }
  29.  
  30. private string remark;
  31. public string Remark
  32. {
  33. get { return remark; }
  34. set
  35. {
  36. if (remark != value)
  37. {
  38. remark = value;
  39. OnPropertyChanged("Remark");
  40. }
  41. }
  42. }
  43.  
  44. private string cronExpression;
  45. public string CronExpression
  46. {
  47. get { return cronExpression; }
  48. set
  49. {
  50. if (cronExpression != value)
  51. {
  52. cronExpression = value;
  53. OnPropertyChanged("CronExpression");
  54. }
  55. }
  56. }
  57.  
  58. private TriggerState triggerState = TriggerState.None;
  59. public TriggerState TriggerState
  60. {
  61. get { return triggerState; }
  62. set
  63. {
  64. if (triggerState != value)
  65. {
  66. triggerState = value;
  67. OnPropertyChanged("TriggerState");
  68. }
  69. }
  70. }
  71.  
  72. private string settingStr = "手动执行";
  73. public string SettingStr
  74. {
  75. get { return settingStr; }
  76. set
  77. {
  78. if (settingStr != value)
  79. {
  80. settingStr = value;
  81. OnPropertyChanged("SettingStr");
  82. }
  83. }
  84. }
  85.  
  86. public DateTime? NextRunTime
  87. {
  88. get
  89. {
  90. if (NextRunTimes != null && NextRunTimes.Length > )
  91. {
  92. return NextRunTimes[];
  93. }
  94. else
  95. {
  96. return null;
  97. }
  98. }
  99.  
  100. }
  101.  
  102. private DateTime[] nextRunTimes;
  103. public DateTime[] NextRunTimes
  104. {
  105. get { return nextRunTimes; }
  106. set
  107. {
  108. if (nextRunTimes != value)
  109. {
  110. nextRunTimes = value;
  111. OnPropertyChanged("NextRunTimes");
  112. OnPropertyChanged("NextRunTime");
  113. }
  114. }
  115. }
  116.  
  117. private DateTime? startTime;
  118. public DateTime? StartTime
  119. {
  120. get { return startTime; }
  121. set
  122. {
  123. if (startTime != value)
  124. {
  125. startTime = value;
  126. OnPropertyChanged("StartTime");
  127. }
  128. }
  129. }
  130.  
  131. private DateTime? endTime;
  132. public DateTime? EndTime
  133. {
  134. get { return endTime; }
  135. set
  136. {
  137. if (endTime != value)
  138. {
  139. endTime = value;
  140. OnPropertyChanged("EndTime");
  141. }
  142. }
  143. }
  144.  
  145. private bool isEdit;
  146. public bool IsEdit
  147. {
  148. get { return isEdit; }
  149. set
  150. {
  151. if (isEdit != value)
  152. {
  153. isEdit = value;
  154. OnPropertyChanged("IsEdit");
  155. }
  156. }
  157. }
  158.  
  159. public CronSecondSet CronSecondSet { get; set; } = new CronSecondSet();
  160. public CronMinuteSet CronMinuteSet { get; set; } = new CronMinuteSet();
  161. public CronHourSet CronHourSet { get; set; } = new CronHourSet();
  162. public CronDaySet CronDaySet { get; set; } = new CronDaySet();
  163. public CronMonthSet CronMonthSet { get; set; } = new CronMonthSet();
  164. public CronWeekSet CronWeekSet { get; set; } = new CronWeekSet();
  165. public CronYearSet CronYearSet { get; set; } = new CronYearSet();
  166. public EasyCronSet EasyCronSet { get; set; } = new EasyCronSet();
  167.  
  168. private Mode mode;
  169. public Mode Mode
  170. {
  171. get { return mode; }
  172. set
  173. {
  174. if (mode != value)
  175. {
  176. mode = value;
  177. OnPropertyChanged("Mode");
  178. CronSecondSet.UpdateExpression();
  179. }
  180. }
  181. }
  182.  
  183. private SetMode setMode = SetMode.Easy;
  184. public SetMode SetMode
  185. {
  186. get { return setMode; }
  187. set
  188. {
  189. if (setMode != value)
  190. {
  191. setMode = value;
  192. OnPropertyChanged("SetMode");
  193. CronSecondSet.UpdateExpression();
  194. }
  195. }
  196. }
  197.  
  198. public event PropertyChangedEventHandler PropertyChanged;
  199. public void OnPropertyChanged(string propertyName)
  200. {
  201. if (PropertyChanged != null)
  202. {
  203. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  204. }
  205. }
  206.  
  207. }
  208.  
  209. public class BaseLog
  210. {
  211. #region 日志输出
  212. [Newtonsoft.Json.JsonIgnore()]
  213. public Action<string, LogLevel> LogOut { get; set; }
  214.  
  215. public void Info(string message)
  216. {
  217. if (LogOut != null)
  218. {
  219. App.Current.Dispatcher.Invoke((Action)delegate ()
  220. {
  221. LogOut(message, LogLevel.INFO);
  222. });
  223. }
  224. }
  225.  
  226. public void DEBUG(string message)
  227. {
  228. if (LogOut != null)
  229. {
  230. App.Current.Dispatcher.Invoke((Action)delegate ()
  231. {
  232. LogOut(message, LogLevel.DEBUG);
  233. });
  234. }
  235. }
  236.  
  237. public void ERROR(string message)
  238. {
  239. if (LogOut != null)
  240. {
  241. App.Current.Dispatcher.Invoke((Action)delegate ()
  242. {
  243. LogOut(message, LogLevel.ERROR);
  244. });
  245. }
  246. }
  247.  
  248. public void FATAL(string message)
  249. {
  250. if (LogOut != null)
  251. {
  252. App.Current.Dispatcher.Invoke((Action)delegate ()
  253. {
  254. LogOut(message, LogLevel.FATAL);
  255. });
  256. }
  257. }
  258.  
  259. public void WARN(string message)
  260. {
  261. if (LogOut != null)
  262. {
  263. App.Current.Dispatcher.Invoke((Action)delegate ()
  264. {
  265. LogOut(message, LogLevel.WARN);
  266. });
  267. }
  268. }
  269. #endregion
  270. }
  271. }

BaseRunner

具体的请自行查看对应的类。

public CronSecondSet CronSecondSet { get; set; } = new CronSecondSet();
        public CronMinuteSet CronMinuteSet { get; set; } = new CronMinuteSet();
        public CronHourSet CronHourSet { get; set; } = new CronHourSet();
        public CronDaySet CronDaySet { get; set; } = new CronDaySet();
        public CronMonthSet CronMonthSet { get; set; } = new CronMonthSet();
        public CronWeekSet CronWeekSet { get; set; } = new CronWeekSet();
        public CronYearSet CronYearSet { get; set; } = new CronYearSet();

public EasyCronSet EasyCronSet { get; set; } = new EasyCronSet();

主要代码就是用户自定义设置,大家运行程序看效果。

另外,这种设置太专业了,不适合用户使用,因此设计了用户常用的模式。

是不是简单友好多了。

至此完结。

下次打算写一个wcf的Demo,当自己学习的动力。

定时任务 Wpf.Quartz.Demo.4的更多相关文章

  1. 定时任务 Wpf.Quartz.Demo.2

    定时任务 Wpf.Quartz.Demo.1已经能运行了,本节开始用wpf搭界面. 准备工作: 1.界面选择MahApp.Metro 在App.xaml添加资源 <Application.Res ...

  2. 定时任务 Wpf.Quartz.Demo.1

    Quartz 是个开源的作业调度框架. 安装:Install-Package Quartz 官网文档地址:https://www.quartz-scheduler.net/documentation/ ...

  3. 定时任务 Wpf.Quartz.Demo.5 (升级版)

    老规矩:先把全部源码上传,见本文底部. 相对于Demo3的区别,就是能自动加载继承了IJob的任务,任务主体程序分离. 在exe执行文件的同级下建一个MyJobs的文件夹,每次会自动扫描该文件夹下的J ...

  4. 定时任务 Wpf.Quartz.Demo.3

    先把全部源码上传,只是一个Demo,希望大家指点一下不足之处,见本文底部. 1.设置界面 2.详情页面 好了,现在慢慢叙述里面的一些方法. 3.实现拷贝的方法: (1) public static v ...

  5. [转][JAVA]定时任务之-Quartz使用篇

    [BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...

  6. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

  7. 震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……

    过场CG:   接到公司领导的文件指示,“小熊”需要在6月底去海外执行一个行动代号为[定时任务]的营救计划,这个计划关系到公司某个项目的生死(数据安全漏洞),作战部拟定两个作战方案: 方案一:使用务定 ...

  8. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  9. Spring 整合 Quartz 实现动态定时任务(附demo)

    最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

随机推荐

  1. [规则原则定理]规则原则定理章2ACID原则

    ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...

  2. 补课:Shell命令${}

    Shell中的${}.##和%%使用范例: 代码如下:file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 / 及其左边 ...

  3. Java SE学习【三】——JDBC

    最近学到了数据库与java的jdbc方面,还有个DAO模式,写一下自己的理解,后期有什么不对的再改. 一.数据库三范式的理解 记得以前上课时,也上了一学期的“数据库系统原理”,给我们上课的老师算是渣渣 ...

  4. activiti如何获取当前节点以及下一步路径或节点(转)

    ACTIVITI相对于JBPM来说,比较年轻,用的人少,中文方面的资料更少,我根据网上到处找得资料以及看官方文档总结出来了代码,非常不容易啊.废话不多说,直接上代码吧: 首先是根据流程ID获取当前任务 ...

  5. Jetty 9的使用

    参考来源:https://www.cnblogs.com/empireghost/p/3522834.html

  6. google pay app权限使用说明

    android.permission.CAMERA. 个人中心使用头像时需要使用该权限. android.permission.READ_PHONE.获取用户DeviceId,作为用户单点登录唯一值.

  7. CHAPITRE III

    Il me fallut longtemps pour comprendre d'où il venait. Le petit prince, qui me posait beaucoup de qu ...

  8. AI学习经验总结

    我的人工智能学习之路-从无到有精进之路 https://blog.csdn.net/sinox2010p1/article/details/80467475 如何自学人工智能路径规划(附资源,百分百亲 ...

  9. Mysql通过sql语句添加约束和查看约束

    一:添加约束 1.添加唯一约束:alter table student add constraint uk_name unique(name); 2.添加外键约束: alter table 表名 ad ...

  10. attachEvent方法绑定事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...