2

次のコード スニペットが正しい方法であるかどうか疑問に思っていました。

Logger.Debug("Check file exists for corresponding path: {0}.", filePath);
var timeDeadline = DateTime.Today + Settings.Default.FileDeadline; //Timespan type
while (!File.Exists(filePath))
{
    if (DateTime.Now > timeDeadline)
        Logger.Error("The file is not available: {0}.", filePath);
    Logger.Info("The file is not yet available. Waiting for 1 hour...");
    Thread.Sleep(TimeSpan.FromHours(1));
}

このコードの目的は、Windows タスク スケジューラを使用して早朝にスケジュールを設定し、通常は 9:00 頃に到着するファイルをロードすることですが、数時間の遅延が発生する可能性があり、最終的には 14:30 (FileDeadline) より前にロードする必要があります。それでも見つからない場合は、見つからないファイルをエラーとして報告します。

また、1 時間おきに例外をスローし、Windows タスクが 1 時間ごとにプロセスを再起動できるようにすることもできますが、C# にプロセスのすべての制御を任せる方がよいと考えました。欠点は、スレッドが 1 時間スリープし、スケジュールされたタスクが何時間も実行されることです。使用されるリソースがごくわずかであるかどうかは気にしませんが、より経験豊富なプログラマーには、より洗練されたソリューションがあるかもしれません。

4

4 に答える 4

3

Thread.Sleep は悪い考えです。タイマー ( System.Timers ) を使用してジョブを実行してください。Timerクラスの情報については、 http://msdn.microsoft.com/en-us/library/system.timers.timer.aspxを参照してください。

于 2013-08-09T08:23:55.007 に答える
0

次の場合に警告を表示します。

待機しているファイルが FTP (または「成長中のファイル」を作成するもの) を介して送信される場合、ファイルが存在するが完全ではないことを示すイベントが発生する可能性があります。また、File.exists メソッドも true を返します。ファイルが部分的であっても。

于 2013-08-09T08:55:22.317 に答える
0

FileSystemWatcher を使用することもできますが、信頼できない可能性があると聞いています http://msdn.microsoft.com/en-gb/library/system.io.filesystemwatcher.aspx

于 2013-08-09T08:29:19.660 に答える