该项目的我的工作需要一些执行工作要做,在一定的时间。我不知道什么是最好的方式来处理这种情况。该方法必须能够生存服务器重新启动/维护。和方法调必须编程。

我正在考虑走这条路:

我可以有一个表中的数据库(或甚至一个消息队)称为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变革,而不是投票。

你有没有看着石英,它工作得很好,而且我敢肯定它实现了所有你需要的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top