0

プロセス中に経過した時間を与える方法が必要です。プロセスの開始時に呼び出し、プロセスの終了時に再度呼び出すと、メソッドは経過した合計時間を出力します。

これは私の方法ですが、常に00:00に時刻を出力します。なぜこれが起こっているのですか?

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
    {
        var stopwatch = new System.Diagnostics.Stopwatch();

        LogBinaryWriter BinaryWriter = new LogBinaryWriter();
        string timeElapsed = "";
        if(time == true)
        {
            stopwatch.Start();
        }
        if (time == false) 
        {
            stopwatch.Stop(); 
            TimeSpan timeSpan = stopwatch.Elapsed;
            timeElapsed = (string.Format("\nFile Generated: {0}\nTime Elapsed: {1} minute(s) {2} second(s)",
            BinaryWriter.CreateLogFileName(filePath, Convert.ToInt32(logSelected)),
            timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds / 10 + "\n"));
            userOptions.DisplayUserMessage(timeElapsed);

        }           
    } 
4

7 に答える 7

2

宣言している場所を見てくださいstopwatch; これはローカル変数です。つまり、2つの異なるストップウォッチを作成して使用しているということです。最初のメソッドは、「true」パラメーターを使用してメソッドを呼び出したときに開始され、メソッドが終了して変数がスコープ外になったときに破棄されます。2番目は宣言され、開始されることはなく、その時刻が調べられてログに記録されます。

この問題を解決するには、ストップウォッチのインスタンス変数(「フィールド」)を宣言します。これにより、オブジェクトが存在する限りスコープ内に保持されます。つまり、メソッドが終了した後も実行が継続され、オブジェクトに戻って停止して検査するときにも同じインスタンスになります。

于 2011-05-05T15:56:54.700 に答える
1

このメソッドが呼び出されるたびに新しいストップウォッチを作成していますが、それはメソッド呼び出し間で永続的である必要があるようです。

于 2011-05-05T15:56:45.023 に答える
1

メソッドの外でストップウォッチ変数宣言を取得します。

于 2011-05-05T15:57:01.100 に答える
1

変数stopwatchはローカルです。関数を2回呼び出すと、関数は再び初期化されます。

宣言をクラスレベルに上げる必要があります。

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();

public void GetTimeElapsed(string filePath, int logSelected, bool time, IUserOptions userOptions)
{
   ... etc
于 2011-05-05T15:58:46.243 に答える
0

使用についてはどうですか:

var startTime = DateTime.Now;

... your code

var elapsed = DateTime.Now - startTime;
于 2011-05-05T15:56:46.347 に答える
0
    if(time == true)
    {
        stopwatch.Start();
    }
    if (time == false) 
    {
        stopwatch.Stop(); 
        ...
    }

trueの場合time、ストップウォッチを開始するだけです。

それが偽の場合、あなたはそれを決して始めません。

より良い構造は次のようになります。

if(time)
{
    stopwatch.Start();
}

... //code to measure here

if (time) 
{
    stopwatch.Stop(); 
    // log elapsed time
}

ノート:

ブール型を使用している場合は、またはと比較しませtruefalse。直接使用してください。反転したい場合は、を使用してください!

于 2011-05-05T15:57:30.290 に答える
-1

timestamp.Minutesの代わりにtimeSpan.TotalMinutesを使用する必要があります。タイムスパンのドキュメントを参照してください

于 2011-05-05T15:56:48.170 に答える