2009-03-26 33 views
3

私が取り組んでいるプロジェクトでは、特定の時点でいくつかの実行が必要です。私はこの状況に対処する最良の方法が何であるかはわかりません。このメソッドは、サーバーの再始動/保守に耐えられる必要があります。また、メソッド呼び出しはプログラムで行う必要があります。 、私はタスクID(PK)、TaskName:指定(varchar型)、TaskStatus(列挙型の成功を持っている可能性がTaskTableと呼ばれるデータベース内のテーブル(あるいはメッセージキュー)を持つことができc#信頼できる遅延実行/スケジュール実行のベストプラクティス

私はこの道を下って行く検討しています失敗した、スケジュールされた)およびTimeOfExecution。しかし、私は、実行されていないタスクについてデータベースを定期的にポーリングするWindowsサービスが必要です。私が直面している問題は、次のことです。データベースに保存するTaskNameとして何を使用しますか?クラス名?クラスとメソッド名ToString?そして、私はどのように文字列を変換して、プログラムで呼び出しを呼び出すことができますか(私は巨大なswitch文を持ちたくありません)?視覚障害のタスクは以下のようになります。だから私は、データベースへとretrival呼び出し上で保存タスクの名前「SendIncompleteNotification」とクラス名を取得することができるように定義さをプログラム

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 

この状況を処理する方法はありますか?ありがとう!

更新日: 私の頭が回転していました。私は今私が間違っていたことが、私の仕事を返すための別の方法/財産を持っていることに気づいた。私がしなければならなかったことは、私の仕事から新しいクラスを鎮圧することでした。そして、私は簡単にクラス名を取得し、dbに文字列を保存し、後で退職して呼び出すことができます。

答えて

3

データベースは要件ですか?

そうでなければ、一般的なコンソールアプリを呼び出すWindowsスケジュールタスク(彼らは「うまくいく」傾向があります)はどうでしょうか?

  • あなたは
  • 他の引数

にすることができます。この方法を定義するインタフェースを実装するクラスの名前を実行するためのタスクを含むDLL:コンソールアプリケーションは、可能性への引数すべてのタスクを1つのアセンブリまたは複数のアセンブリに入れます。あるいは、属性を作成してその属性をタスクに適用して「フレンドリ名」を付けることができます。また、アセンブリに対するリフレクションを使用して、一致する属性を持つクラスを検索することもできます。

編集:例:

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

私は答えを –

+0

更新しました申し訳ありません私の頭が回転していた。私は今私が間違っていたことが、私の仕事を返すために別の方法/財産を持っていることに気付いた。。私がしなければならなかったことは、私の仕事で新しいクラスを恒久化することでした。。そして私は簡単にクラス名を得ることができます。 – Jeff

+0

あなたに感謝して、私は答えとしてあなたの答えをマークします – Jeff

3

Windows Workflowを調べることができます。それらは長時間実行されるプロセス用に設計されており、データベースに永続化され、イベントまたはタイマーで私が知る限りで目覚めることができます。

1

アセンブリFullNameを格納し、FullNameとメソッド名を入力します。メソッドのシグネチャが何か予測可能であると仮定すると(パラメータがなく、voidが返されるなど)

1)アセンブリ型の静的LoadFromメソッドを使用してアセンブリのインスタンスを作成します。

2)GetTypeメソッド

3)GetMethod方法

4)タイプ用いアクティベーターのインスタンスを作成を使用して型からMETHODINFOインスタンスを取得を使用して、アセンブリからクラス型への参照を取得します.CreateInstance

5)MethodInfoインスタンスのInvokeを使用して、手順4のクラスインスタンスを渡してメソッドを実行します。(私はVSのコピーを持たない公共のコンピュータで実際のコードをクランクしていますが、 5つのステップがあります。

また、SQL 2005を使用している場合は、SqlDependencyオブジェクトを使用し、ポーリングではなくタビが変更されたときに「通知」を受けることを検討してください。

1

あなたはQuartzを見ましたか?それはかなりうまくいきます。私はあなたが必要とするすべての機能を実装していると確信しています。

+0

私は見ていただきありがとうございます、あなたに戻ってきます – Jeff

関連する問題