JobStart("TurnOn", "Cron", "TEST", "on", "0/5 0 12 ? * 1,3,5 "); 這是資料庫抓出來後會回傳這些
使用WPF NET6 目前打開程式後沒有錯誤訊息
但是排程沒有執行messagebox.show出來
Task.cs
using System;
using System.Threading.Tasks;
using System.Windows;
using Quartz;
namespace KoModel.Quartz
{
#region Job
//2、創建一個任務 Create<Class(Task Name)> <= QuartzConfig.cs
public class MyJob
{
public IJobDetail TurnOn(string title, string groups = "on")
{
IJobDetail job = JobBuilder.Create<TurnOn>().WithIdentity(title, groups).Build();
return job;
}
}
#endregion
#region Task
//打上DisallowConcurrentExecution標簽讓Job進行單線程跑,避免沒跑完時的重覆執行。
[DisallowConcurrentExecution]
public class TurnOn : IJob
{
public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>
{
MessageBox.Show("開啟 現在時間:" + DateTime.Now);
});
}
}
#endregion
}
Quartz.cs
using Quartz.Impl;
using Quartz;
using System;
namespace KoModel.Quartz
{
public static class QuartzConfig
{
//調度器工廠
private static ISchedulerFactory? schedulerFactory;
//調度器
private static IScheduler? scheduler;
public static ITrigger trigger(string type, string title, string groups = "on", string time = "5")
{
//3、創建一個觸發器(有4種觸發器供選擇)
//重複執行:WithRepeatCount(count) / RepeatForever(count)
//間格時間:WithInterval(time)
//定時執行:StartAt() / StartNow()
//設定優先:WithPriority(),default 5
ITrigger trigger;
switch (type)
{
case "Simple":
#region 觸發器1:WithSimpleSchedule
trigger = TriggerBuilder.Create()
.WithIdentity(title, groups)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(int.Parse(time)).RepeatForever())
.Build();
#endregion
break;
case "Daily":
#region 觸發器2:WithDailyTimeIntervalSchedule
trigger = TriggerBuilder.Create()
.WithIdentity(title, groups)
.WithDailyTimeIntervalSchedule(x => x.OnEveryDay().WithIntervalInSeconds(int.Parse(time)))
.Build();
#endregion
break;
case "Calendar":
#region 觸發器3:WithCalendarIntervalSchedule
trigger = TriggerBuilder.Create()
.WithIdentity(title, groups)
.WithCalendarIntervalSchedule(x => x.WithIntervalInSeconds(int.Parse(time)))
.Build();
#endregion
break;
case "Cron":
default:
#region 觸發器4:WithCronSchedule()
trigger = TriggerBuilder.Create()
.WithIdentity(title, groups)
.WithCronSchedule(time)
.Build();
#endregion
break;
}
return trigger;
}
public static async void Run(IJobDetail job, ITrigger trigger)
{
//1、創建一個調度器
schedulerFactory = new StdSchedulerFactory();
scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start();
JobKey jobKey = new JobKey(job.Key.Name, job.Key.Group);
TriggerKey triggerKey = new TriggerKey(trigger.Key.Name, trigger.Key.Group);
bool exists = await scheduler.CheckExists(jobKey);
if (!exists)
{
// 該工作還沒有執行
//4、將任務與觸發器添加到調度器中
await scheduler.ScheduleJob(job, trigger);
}
//5、開始執行
await scheduler.Start();
}
public static void Shutdown()
{
if (scheduler != null)
{
scheduler.Shutdown(true);
}
}
}
}
ShellViewModel.cs
public async void JobStart(string functionName, string type, string title, string groups = "on", string time = "5")
{
ITrigger iTrigger = QuartzConfig.trigger(type, title, groups, time);
//// 取得 ExampleClass 的 Type 物件
MyJob myJob = new MyJob();
//// 從 Type 物件中查找指定名稱的方法
MethodInfo methodInfo = typeof(MyJob).GetMethod(functionName);
IJobDetail iJobDetail;
//// 如果找到了該方法,調用它
if (methodInfo != null)
{
object[] parameters = new object[] { title, groups };
iJobDetail = (IJobDetail)methodInfo.Invoke(myJob, parameters);
QuartzConfig.Run(iJobDetail, iTrigger);
}
else
{
MessageBox.Show("未定義此排程");
}
}
public List<JobViewList> SelectJobList()
{
List<JobViewList> entries = new List<JobViewList>();
using (var db = new SqliteConnection(DataAccess.GetConnStringForSelf()))
{
db.Open();
var command = new SqliteCommand("SELECT id, title, sCron, eCron, groups From JobList", db);
SqliteDataReader query = command.ExecuteReader();
while (query.Read())
{
JobViewList joblist = new JobViewList();
joblist.id = int.Parse(query["ID"].ToString());
joblist.title = query["Title"].ToString();
joblist.sCron = CronReString("Time", query["sCron"].ToString());
joblist.eCron = CronReString("Time", query["eCron"].ToString());
joblist.StringDay = CronReString("WeekDay", query["sCron"].ToString());
joblist.groups = query["groups"].ToString();
entries.Add(joblist);
JobStart("TurnOn", "Cron", query["Title"].ToString(), "on", query["sCron"].ToString());
//JobStart("TurnOff", "Cron", query["Title"].ToString(), "off", query["eCron"].ToString());
}
db.Close();
}
return entries;
}
public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>
{
Application.Current.Dispatcher.Invoke(() =>
{
MessageBox.Show("開啟 現在時間:" + DateTime.Now);
});
});
}