2011-07-26 8 views
0

関数呼び出しの進行状況を計算するために使用されるアルゴリズムにはどのようなものがありますか?非同期関数呼び出しの進行状況を報告するアルゴリズム

行うことが明らかにその簡単なあなたは、ループ、のようなものがある場合:あなただけのいくつかの一般的なデリゲートを持っていて、非同期的にそれを実行するだけでなく、別のスレッドに通知したいとき、およそ

Action<Double> notifier = d => Console.WriteLine("Completed: " + d.ToString()); 

Double _interval = 0.05; 

for (int i = 0; i < 1000; i++) 
      { 
       int rem = default(int); 

       Math.DivRem(i, _interval, out rem); 

       if (rem == 0) 
       { 
        double progress = (double)i/1000; 
        notifier(progress); 
       } 
      } 

しかし、何をその進歩、そしてあなたはfor-loopを簡単に使うことができないのですか?他のいくつかの簡単な方法があるかもしれない:

1)時間最初に(非常にパフォーマンスただしその場合は、実行時間の長いタスク)ログ内の関数のタイミング過去

2)ストアに悪いと機能(つまりを使用しますが、これは必ずしもタスクの特定の時間にCPU、メモリなどの余分な変数を考慮しない)

ただし、進捗状況を近似する場合でも、それ以上の高度なアルゴリズムは存在しますか?

+0

過去のタイミングを保存することができれば、それを実行する最善の方法です。 CPUとメモリはおそらくあまりにも余裕があります。過去のタイミングは将来のパフォーマンスの最良の指標です –

答えて

2

BackgroundWorkerクラスには更新コールバックがありますが、完了を見つけるための「ジェネリックアルゴリズム」の質問に答えて、それは本当にありません。あなたが得ることができる最も近いのは、関数の長さ(http://www.ndepend.com/)に基づいて見積もることで、コード行で長さを取得します。

+0

これは興味深いことですが、コード行を見てください。あなたがメタデータツリーを歩き回り、関与するプリミティブ操作の総数を測定し、それに基づいて見積もりを計算しようとする反射ベースのアプローチを使用できるかどうかは疑問です。 –

+0

おそらくNDependやプログラムデータベース(pdb)を使って行うことができます。その中で最も難しい部分は、プログラムのスタックポインタを取得しているので、現在のコードのどこにあるのかを知ることができます。私はC#がそのほとんどを抽象化していると思います –

1

ワーカー関数をコールバックデリゲートに渡して、UIの進行状況を報告します。

UIは「何をするか」を担当するべきではなく、単に作業者からの更新を取得する必要があります。例えば

void longRunningFunction(Action<int> updateCallback) 
{ 
     // Do something long, but on measurable places, call updateCallback 
     updateCallback(50); 
} 

そして、UIで:

longRunningFunction(x => progressBar.SetProgress(x)); 
+0

これは私が過去にやったことであると確信しています。 –

+0

私の質問は、何らかの理由で関数にupdateCallback()を書くことができず、実行中の進捗状況を推論したい汎用のFuncまたはActionを持っている場合に適しています。たとえば、ファイルIO機能のようなものがあるとします。非常に小さなファイルで実行し、時間をかけて、その時間を使って、長いファイルがどれくらい長くかかるかを概算することができます。 –

1

が、これは学術的な問題ですか?

ない場合は、ReportProgress方法で構築しているBackgroundWorkerを、使用することを選ぶことができ

http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

私はあなたが興味があれば、あなたもその実装を見て、.NETリフレクターを使用することができたと

+0

そのReportProgressメソッドは、あなたの関数にどんな種類のタイミング/進捗レポートを書かなくても、何らかの形でパーセント完成図を計算しますか?もしそうなら、私は本当にそれがどのように機能するかに興味があると思います。 –

+0

実際には、そうではありません。あなたが探しているものではありません。 –

関連する問題