3

長いタスクを実行する関数があり、ステータスの更新で時々別の場所で変数を更新したいと思います。(これを行うためのより良い方法があれば、それも問題ありません)私はライブラリを書いていますが、このコードは一度に複数回呼び出される可能性があるため、変数を格納する同じクラスに別の変数を作成することはできません。これが私のコードがどのように見えるかです:

public static bool Count(int Progress, int CountToWhat) {
    for (int i = 0; i < CountToWhat; i++) {
        Progress = CountToWhat / i; // This is how I'd like to update the value, but obviously this is wrong
        Console.WriteLine(i.ToString());
    }
}
4

4 に答える 4

4

これは、発信者に更新を提供するための良い方法ではありません。

クラスライブラリにもう1つ以上のイベント(、など)を定義することをお勧めしOnErrorますOnProgressOnProgressたとえば、特定の操作の進行状況を通知する場合は、次のように上げることができます。

for (int i = 0; i < CountToWhat; i++) {
  OnProgress(CountToWhat / i);
  Console.WriteLine(i.ToString());
}

これは、特にワーカースレッドから通知する場合に、はるかに優れた方法です。

于 2012-07-06T15:09:20.433 に答える
3

署名を次のように変更します。

public static bool Count(ref int Progress, int CountToWhat)

そして、それを呼び出すときは、最初の引数として渡す変数の前にrefキーワードを使用します。

于 2012-07-06T15:07:25.457 に答える
2

使用できます

int Progress = 0;
public static bool Count(ref int Progress, int CountToWhat)
{
  ....
}

または

int Progress; //without init
public static bool Count(out int Progress, int CountToWhat)
{
  ....
}
于 2012-07-06T15:06:52.527 に答える
1

Action<int>より良い方法は、進捗状況を報告するために呼び出される代理人を渡すことです。

public static bool Count(int CountToWhat, Action<int> reportProgress) 
{
    for (int i = 0; i < CountToWhat; i++) 
    {
        var progress = CountToWhat / i; 
        reportProgress(progress);
        Console.WriteLine(i.ToString());
    }
}

次に、次のように使用します。

Count(100, p => currentProgress = p);

また、 BackgroundWorkerクラスを使用して、長時間実行されるタスクを実行し、そのProgressChangedイベントを利用することもできます。

于 2012-07-06T15:13:35.100 に答える