c#可靠的延迟/计划的执行的最佳做法
-
22-08-2019 - |
题
该项目的我的工作需要一些执行工作要做,在一定的时间。我不知道什么是最好的方式来处理这种情况。该方法必须能够生存服务器重新启动/维护。和方法调必须编程。
我正在考虑走这条路:
我可以有一个表中的数据库(或甚至一个消息队)称为TaskTable这可能有TaskID(PK),任务名(varchar),TaskStatus(枚举的成功、失败、计划)和TimeOfExecution.但我需要一个windows服务,定期民意调查的数据库,用于任何未执行的任务。问题我面对的是:什么我使用的任务名保存入数据库?类的名字吗?类和方法名称ToString?和我如何可以转换的串回和编程方式援引的方法的呼吁(我不想要有一个巨大的开发言)?一typtical的任务看起来像下面。所以我ned能够得到的任务的名称"SendIncompleteNotification"和类名称的保存入数据库,并在retrival调用的通过程序
public static Task<string> SendIncompleteNotification
{
get
{
return new Task<string>
(
a => Console.WriteLine("Sample Task")
, "This is a sample task which does nothing."
);
}
}
现在的问题是我具有的问题节省的方法/属名progrmatically.
var type = ApplicationTask.SendIncompleteNotification.GetType();
//type.Name shows "Task`1" rather than SendIncompleteNotification
是否有任何更好方式处理这种情况?谢谢!
更新:对不起我的头晕目眩。我现在意识到我做错了什么是有另一种方法/属返回我的任务。什么我应该做的是有一个新的类inhrite从我的任务。而且我可以很容易地获得这类名称和节省串入数据库和后retireve回和调用。
解决方案
数据库是个要求?
如果不是,什么有关Windows计划的任务(他们有一种倾向,"仅仅是工作")这调入一个一般控制台应用程序。的参数的控制台应用程序的可以是:
- DLL含有任务要执行
- 名称的一类实现一个接口定义
- 其他参数
这样你可以把所有的任务为一个组件,或多个。或者您可以创建一个属性,适用于属性的任务给予他们"友好的名称",并使用反映在大会以找到类匹配的属性。
编辑:例如:
interface ITask
{
void Execute(ExcecutionContext context);
}
[TaskName("Send Emails")
class SendEmailsTask : ITask
{
public void Execute(ExcecutionContext context)
{
// Send emails. ExecutionContext might contain a dictionary of
// key/value pairs for additional arguments needed for your task.
}
}
class TaskExecuter
{
public void ExecuteTask(string name)
{
// "name" comes from the database entry
var types = Assembly.GetExecutingAssembly().GetTypes();
foreach (var type in types)
{
// Check type.GetCustomAttributes for the TaskAttribute, then check the name
}
}
}
编辑2:这是在回答你的代码样本。
class YourClass
{
public static Task<string> SendIncompleteNotification
{
get {
return new Task<string>(
s => Console.WriteLine("Executing task... arguments: {0}", s),
"My task");
}
}
}
interface ITask
{
void Execute(object o);
}
class Task<T> : ITask
{
public Task(Action<T> action, string name)
{
Action = action;
}
public string Name { get; set; }
public Action<T> Action { get; set; }
void ITask.Execute(object o)
{
Action((T)o);
}
}
class Program
{
static void Main(string[] args)
{
// Assume that this is what is stored in the database
var typeName = typeof (YourClass).FullName;
var propertyName = "SendIncompleteNotification";
var arguments = "some arguments";
// Execute the task
var type = Type.GetType(typeName);
var property = type.GetProperty(propertyName);
var task = (ITask)property.GetValue(null, null);
task.Execute(arguments);
Console.ReadKey();
}
}
其他提示
您可能想看看Windows工作流。它们是专为长时间运行的进程,可以保存到数据库中,并在事件或定时唤醒,因为据我所知。
店铺装配全名,并键入全名及方法名。假设方法签名是可预测的东西(如没有参数和返回void)
1),使用大会类型的静态LoadFrom方法创建该组件的一个实例。
2)使用GetType方法的组件获得的类类型的引用
3)从式使用实现getMethod方法得到的MethodInfo实例
4)创建使用Activator.CreateInstance一个的类型的实例
5)执行使用MethodInfo的实例的调用方法中,在类实例将来自步骤4。(抱歉我在没有VS的拷贝发送到曲柄了真实代码公共计算机,但这些5个步骤将做。
此外,如果你正在使用SQL 2005可以考虑使用的SqlDependency对象,并得到“通知”时,你的talbe变革,而不是投票。
你有没有看着石英,它工作得很好,而且我敢肯定它实现了所有你需要的功能。