クラスライブラリなどで共通関数を作るときになどに、共通関数の処理の中に進捗を表示する機能をつけておきたいことがあるかと思います。
そういったときはdelegadeを使えば便利です。delegadeを使えばどこに進捗を表示するか呼び出し元に合せて対応することができます。
具体例
下記のように、Class1クラスの中に進捗を表示するメソッドをdelegatdeとして用意しておくことで、いろいろな呼び出し元がケースでも進捗を表示が可能です。
public class Class1
{
/// <summary>
/// 進捗を表示するメソッドをもつ
/// </summary>
/// <param name="progress">何件終わったか</param>
/// <param name="fileCount">全体の数</param>
public delegate void DispProgress(
long progress,
long overall
);
/// <summary>
/// 処理中に進捗を表示させたい共通関数
/// </summary>
/// <param name="dispProgress"></param>
public void Function1(DispProgress dispProgress)
{
long progress = 0; //何件終わったか
long overall = 10; //全体の数
for (int i1=0; i1< 10; i1++)
{
System.Threading.Thread.Sleep(1000);
progress += 1;
dispProgress(progress, overall);
}
}
}
例1:コンソールアプリケーションから呼び出す
上記のdelegadeに合せる形の引数と戻り値のメソッドを定義し、その中にコンソール画面上に進捗を表示する処理を記述します。
そしてFuction1メソッドの引数へ渡すことでコンソール上に進捗を表示することができます。
static void Main(string[] args)
{
ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
c1.Function1(DispProgressConsole);
}
/// <summary>
/// 処理の進捗をコンソール上に表示する
/// </summary>
/// <param name="progress">何件終わったか</param>
/// <param name="overall">全体の数</param>
static private void DispProgressConsole(long progress, long overall)
{
Console.CursorLeft = 0;
Console.Write("進捗:" + progress.ToString() + "/" + overall.ToString() + " 件完了");
}
例2:フォームアプリケーションで呼び出す
上記のdelegadeに合せる形の引数と戻り値のメソッドを定義し、その中にフォーム画面のラベル上に進捗を表示する処理を記述します。
private void button1_Click(object sender, EventArgs e)
{
ClassLibrary1.Class1 c1 = new ClassLibrary1.Class1();
c1.Function1(DispProgressWindowsForm);
}
/// <summary>
/// 処理の進捗をLabelに表示する
/// </summary>
/// <param name="progress">何件終わったか</param>
/// <param name="overall">全体の数</param>
private void DispProgressWindowsForm(long progress, long overall)
{
label1.Text = "進捗:" + progress.ToString() + "/" + overall.ToString() + " 件完了";
label1.Update();
}
以上となります。参考になれば幸いです。