gpt4 book ai didi

c# 可靠的延迟/计划执行最佳实践

转载 作者:行者123 更新时间:2023-11-30 14:05:05 24 4
gpt4 key购买 nike

我正在做的项目需要在特定时间完成一些执行。我不确定处理这种情况的最佳方法是什么。该方法必须能够在服务器重启/维护后继续存在。并且方法调用必须以编程方式进行。

我正在考虑走这条路:

我可以在数据库(甚至消息队列)中有一个名为 TaskTable 的表,它可以有 TaskID(PK)、TaskName(varchar)、TaskStatus(enum success、failed、scheduled) 和 TimeOfExecution。但我需要一个 Windows 服务,它会定期轮询数据库以查找任何未执行的任务。我面临的问题是:我使用什么作为 TaskName 保存到数据库中?类(class)名称?类和方法名 ToString?我怎样才能将字符串转换回来并以编程方式调用方法调用(我不想有一个巨大的 switch 语句)?典型的任务如下所示。所以我需要能够获取任务“SendIncompleteNotification”的名称和类名,将其保存到数据库中,并在检索时以编程方式调用

public static Task<string> SendIncompleteNotification
{
get
{
return new Task<string>
(
a => Console.WriteLine("Sample Task")
, "This is a sample task which does nothing."
);
}
}

现在的问题是我在以编程方式保存方法/属性名称时遇到问题。

var type = ApplicationTask.SendIncompleteNotification.GetType();
//type.Name shows "Task`1" rather than SendIncompleteNotification

有没有更好的方法来处理这种情况?谢谢!

更新:对不起,我的头在旋转。我现在意识到我做错的是使用另一种方法/属性来返回我的任务。我应该做的是从我的任务中继承一个新类。在那里我可以轻松获取类名并将字符串保存到数据库中,然后返回并调用。

最佳答案

数据库是必需的吗?

如果不是,那么调用通用控制台应用程序的 Windows 计划任务(它们倾向于“正常工作”)又如何呢?控制台应用程序的参数可以是:

  • 包含要执行的任务的 DLL
  • 实现您定义的接口(interface)的类的名称
  • 其他论据

通过这种方式,您可以将所有任务放入一个或多个程序集中。或者,您可以创建一个属性,将该属性应用于您的任务以给它们一个“友好的名称”,然后在程序集上使用反射来查找具有匹配属性的类。

编辑:示例:

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();
}
}

关于c# 可靠的延迟/计划执行最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/684406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com