0

これが私の問題です。リモートSQLサーバー2008[正確にはExpressエディション]にログインし、データベーステーブル(たとえばfoo)から定期的にデータをフェッチするC#アプリケーションをコーディングしています[各フェッチ後にSQLクライアント接続が閉じられます]。

60秒程度の時間間隔でこのプロセスを定期的に実行するにはどうすればよいですか(ユーザー定義可能)。??

4

3 に答える 3

1

プロパティを使用して「ワンショット」タイマーとして構成できるものをSystem.Threading.Timer使用する代わりに、次のようにします。System.Timers.TimerAutoReset

System.Timers.Timer sqlTimer = new System.Timers.Timer();
sqlTimer.Interval = 60000; // One minute
sqlTimer.AutoReset = false; // Fire only once
sqlTimer.Elapsed = TimerEvent; // Assign event for timer
sqlTimer.Start(); // Start the timer

その場合、タイマーは1回だけ起動するため、ロックや同期について心配する必要はありません。

private void TimerEvent(object source, ElapsedEventArgs e)
{
    // Do your SQL-stuff

    // Restart the timer if you want
    sqlTimer.Start();
}

このタイマーも別のスレッドで実行されるためTimerEvent、タイマーを作成したスレッドのコンテキストではイベントが呼び出されないことに注意する必要があります。これは、UI要素を更新する必要がある場合に知っておくことが重要です。

名前空間がわからないため、これは.NET Compact Frameworkでは機能しないことに注意してくださいSystem.Timers。その場合は、Richardのソリューションを使用する必要があります。

于 2012-10-30T16:04:30.250 に答える
1

60秒程度の時間間隔で

60秒は、Windowsタスクスケジューラが設定されているようなものよりもかなり少なく、詳細設定を介して実行できます(1日1回、1分ごとに繰り返す)。

未解決の質問の1つは、タスクの実行にスケジューラー間隔よりも時間がかかる場合はどうすればよいかということです。2つの実行が重複することはできますか?それらが次のような単純なものとオーバーラップできると仮定します。

var timer = new System.Threading.Timer(method, null, 
                                       TimeSpan.Zero, // Start now.
                                       TimeSpan.FromSeconds(60));

ここmethodで、はタイプのデリゲートです:状態(上記で渡された)をTimerCallback取り、何も返しません。object null

スキップされたと仮定して、次のタスクがスキップまたは遅延された場合に呼び出しがオーバーラップすることを許可したくない場合:

var object locker = new object();
var timer = new System.Threading.Timer(_ => {
  bool entered = Monitor.TryEnter(locker);
  try {
    if (entered) {
      method(null);
    }
  } finally {
     if (entered) {
       Monitor.Exit(locker);
     }
  }
},  null, TimeSpan.Zero, TimeSpan.FromSeconds(60));

(ここでも、methodワーカーコードです)。

于 2012-10-30T15:47:33.150 に答える
-1

SQL Serverエージェント内の組み込みスケジューラー、またはWindowsに組み込まれているスケジューラーを使用してみませんか?なぜ車輪の再発明をするのですか?

MSDNから

SQLServerエージェントの利点SQLServerエージェントは、SQLServerを使用してジョブ情報を格納します。ジョブには、1つ以上のジョブステップが含まれます。各ステップには、データベースのバックアップなど、独自のタスクが含まれています。

SQL Serverエージェントは、スケジュールに従って、特定のイベントに応答して、またはオンデマンドでジョブを実行できます。たとえば、すべての会社のサーバーを平日の営業時間外にバックアップする場合は、このタスクを自動化できます。月曜日から金曜日の22:00以降に実行するようにバックアップをスケジュールします。バックアップで問題が発生した場合、SQLServerエージェントはイベントを記録して通知することができます。

またはこれを参照してください:

独自のアプリケーションでWindows7タスクスケジューラを使用することは可能ですか?

また

毎日タスクを実行するようにC#Windowsサービスをスケジュールするにはどうすればよいですか?

于 2012-10-30T09:50:15.890 に答える