C#のコールバック関数とは?C#のコールバック関数について紹介

- システム
エンジニア - コールバック関数とはどういったものなのか教えてください。
- プロジェクト
マネージャー - コールバック関数とは、特定のタスクの実行が完了した際に呼び出される関数のことです。詳しく見ていきましょう。
C#でのコールバック関数について
今回は、C#でのコールバック関数について説明します。
コールバック関数とは、何かの処理が終わったあとに、実行したい処理のことです。非同期処理の終了を通知する場合などに使用されます。
ここでは、Delegateを使ったコールバック関数について紹介します。C#でのコールバック関数に興味のある方はぜひご覧ください。
Delegateとは
C#でのコールバック関数の前にDelegateについて説明します。
Delegateとは、C言語でいうところの関数ポインタのようなものです。関数を変数のように扱うことができます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
using System;
namespace ConsoleApplication1
{
class Program
{
// delegate型の宣言
public delegate void Delegate();
static void Main()
{
// 変数をdelegate型で定義
Delegate hello = Hello;
// 実行
hello();
Console.ReadLine();
}
static void Hello()
{
Console.WriteLine("Hello World!");
}
}
}
|
実行結果は以下のようになります。
1
|
Hello World!
|
変数helloに関数Helloを代入して実行しています。Hello World!が出力されることが分かります。
ここでは、Delegateの関数に引数はありませんが、引数を追加することもできます。このように、C#ではDelegateを利用して関数を変数のように扱うことができます。
Delegateとコールバック関数
C#では、Delegateを利用すれば、コールバック関数として呼び出すことができます。コールバック関数で非同期処理の終了を通知します。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
using System;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
// delegate型の宣言
public delegate void Callback(bool res);
static void Main()
{
// 変数をdelegate型で定義
Callback afterSomeMethod = AfterSomeMethod;
// 非同期処理
Task task = Task.Run(() =>
{
SomeMethod(afterSomeMethod);
});
// 何かの処理
for(int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("メイン処理 {0}", i);
}
Console.ReadLine();
}
// コールバック関数
static void AfterSomeMethod(bool res)
{
Console.WriteLine("非同期処理の終了。res:{0}", res);
}
// 非同期処理の関数
static void SomeMethod(Callback callback)
{
// 何かの処理
for (int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("非同期処理 {0}", i);
}
// Callback型のDelegate実行。SomeMethodの実行結果(true固定)を渡す
callback(true);
}
}
}
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
|
非同期処理 0
メイン処理 0
非同期処理 1
メイン処理 1
非同期処理 2
メイン処理 2
非同期処理 3
メイン処理 3
非同期処理 4
非同期処理の終了。res:True
メイン処理 4
|
AfterSomeMethodをコールバック関数として指定しています。SomeMethodが終了すると、コールバック関数が実行されます。
このように、C#ではDelegateを利用すれば、コールバック関数として呼び出すことができます。
Action型変数
Delegate定義しなくても、Action型の変数にすれば、ソースコードがシンプルになります。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
using System;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// 非同期処理
Task task = Task.Run(() =>
{
SomeMethod(AfterSomeMethod);
});
// 何かの処理
for(int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("メイン処理 {0}", i);
}
Console.ReadLine();
}
// コールバック関数
static void AfterSomeMethod(bool res)
{
Console.WriteLine("非同期処理の終了。res:{0}", res);
}
// 非同期処理の関数
// Delegate定義しなくても、Action型の変数にすればよい
static void SomeMethod(Action<bool> callback)
{
// 何かの処理
for (int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("非同期処理 {0}", i);
}
// Callback型のDelegate実行
callback(true);
}
}
}
|
delegate型の宣言を削除しています。また、SomeMethodの引数を”Action<bool>”にしています。
このように、C#ではDelegateを定義しなくても、Action型の変数にすればソースコードがシンプルになります。
ラムダ式
ラムダ式を利用すれば、さらにシンプルに記述できます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
using System;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// 非同期処理
Task task = Task.Run(() =>
{
// ラムダ式
SomeMethod((res) =>
{
Console.WriteLine("非同期処理の終了。res:{0}", res);
});
});
// 何かの処理
for(int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("メイン処理 {0}", i);
}
Console.ReadLine();
}
// 非同期処理の関数
static void SomeMethod(Action<bool> callback)
{
// 何かの処理
for (int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("非同期処理 {0}", i);
}
// Callback型のDelegate実行
callback(true);
}
}
}
|
AfterSomeMethodを削除しました。SomeMethodの引数にラムダ式を使用しました。
このように、C#ではラムダ式を利用すれば、さらにシンプルに記述できます。
- システム
エンジニア - #Cの関数ポインタのようなものと考えるとわかりやすいですね。
- プロジェクト
マネージャー - そうですね。コールバック関数と覚えるとわかりにくくなるかもしれません。皆さんの覚えやすい定義で覚えていくのが無難でしょう。
まとめ
いかがでしたでしょうか。C#での、Delegateを使ったコールバック関数について説明しました。
コールバック関数とは、何かの処理が終わったあとに、実行したい処理のことです。非同期処理の終了を通知する場合などに使用されます。
ぜひご自身でC#のソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)