문제

내가 작업중 인 프로젝트는 특정 시간에 몇 가지 실행을해야합니다. 이 상황을 다루는 가장 좋은 방법이 무엇인지 잘 모르겠습니다. 이 방법은 서버 재시작/유지 보수에서 살아남을 수 있어야합니다. 메소드 호출은 프로그래밍 방식으로 여야합니다.

나는이 길을 따라가는 것을 고려하고있다 :

TaskID (PK), TaskName (VarChar), TaskStatus (Enum Success, 실패, 예약) 및 TimeOfExecution을 가질 수있는 TaskTable이라는 데이터베이스 (또는 메시지 대기열)에 테이블을 가질 수 있습니다. 그러나 실행되지 않은 작업에 대한 데이터베이스를 정기적으로 설문 조사하는 Windows 서비스가 필요합니다. 내가 직면하고있는 문제는 다음과 같습니다. 데이터베이스에 저장하기 위해 작업 이름으로 무엇을 사용합니까? 클래스 이름? 클래스 및 메소드 이름 Tostring? 그리고 문자열을 다시 변환하고 메소드 호출을 프로그래밍 방식으로 호출하려면 어떻게해야합니까 (거대한 스위치 명령문을 갖고 싶지 않습니까)? 지배적 인 작업은 아래에서 보일 것입니다. 그래서 나는 "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

이 상황을 다루는 더 좋은 방법이 있습니까? 감사!

업데이트 : 머리가 회전하고 죄송합니다. 나는 내가 잘못한 것이 내 임무를 반환 할 다른 방법/속성을 가지고 있다는 것을 깨달았다. 내가해야 할 일은 내 임무로부터 새로운 계급이 억제되는 것이 었습니다. 그리고 그곳에서 나는 클래스 이름을 쉽게 가져 와서 문자열을 db로 저장하고 나중에 다시 은퇴하고 호출 할 수 있습니다.

도움이 되었습니까?

해결책

데이터베이스가 요구 사항입니까?

그렇지 않은 경우 일반 콘솔 앱으로 호출하는 Windows Scheduled 작업 ( "그냥 작동하는"경향이 있음)은 어떻습니까? 콘솔 앱에 대한 인수는 다음과 같습니다.

  • 실행하는 작업을 포함하는 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 워크 플로를 살펴보고 싶을 수도 있습니다. 그들은 장기적인 프로세스를 위해 설계되었으며 데이터베이스에 지속될 수 있으며 내가 아는 한 이벤트 나 타이머에서 깨어났습니다.

어셈블리 풀 이름을 저장하고 풀 이름과 메소드 이름을 입력하십시오. 메소드 서명이 예측할 수있는 것이라고 가정합니다 (매개 변수 및 반환 공극 등)

1) 어셈블리 유형의 정적로드 방법을 사용하여 어셈블리 인스턴스를 만듭니다.

2) GetType 방법을 사용하여 어셈블리에서 클래스 유형에 대한 참조를 받으십시오.

3) getMethod 메서드를 사용하여 유형에서 MethodInfo 인스턴스 가져옵니다.

4) Activator.createInstance를 사용하여 유형의 인스턴스를 만듭니다.

5) MethodInfo 인스턴스의 호출을 사용하여 메소드를 실행하여 4 단계에서 클래스 인스턴스를 전달합니다 (실제 코드를 크랭크하기 위해 vs의 사본이없는 공용 컴퓨터에있는 것이 죄송하지만 5 단계는 그렇게 할 것입니다.

또한 SQL 2005를 사용하는 경우 SQLDependency 객체를 사용하고 폴링이 아닌 Talbe가 변경 될 때 "알림"을받는 것을 고려하십시오.

당신은 보셨습니까? 석영, 그것은 꽤 잘 작동하며, 필요한 모든 기능을 구현한다고 확신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top