4. NEC BaaS .NET API の基本¶
4.1. 非同期呼び出し (async/await)¶
ほとんどの NEC BaaS .NET API は、非同期呼び出しとなります。 非同期呼び出し API は、メソッドの名の末尾が "Async" となっています。
非同期処理は async/await キーワードを使用して記述できます。
以下に、オブジェクトをクエリする場合の例を示します。
public async void TestQueryAsync()
{
NbObjectBucket bucket = NbObjectBucket.New("bucket1");
try {
var objects = await bucket.QueryAsync(new NbQuery());
foreach (var object in objects) {
...
}
}
catch (Exception e) {
// 例外処理
}
}
非同期処理には、async / await を使用します。
非同期処理を行うメソッドには async キーワードを付与します。 .NET SDK の非同期 API (上記例は QueryAsync)を呼び出す際は await キーワードを付与します。 await 以下に記述されたコードは、非同期に実行されます。
非同期エラーはすべて例外で処理されます。 非同期処理中にエラーが発生した場合、await の実行時に例外がスローされますので、 try 節で適宜処理してください。
4.2. 非同期呼び出し (Task)¶
async / await を使わず Task で処理したい場合は以下のようになります。 以下のコードは、上記 async/await を使用するコードと等価です。
public void TestQueryAsync()
{
NbObjectBucket bucket = NbObjectBucket.New("bucket1");
var task = bucket.QueryAsync(new NbQuery());
task.ContinueWith(_ =>
{
try {
var objects = _.Result;
foreach (var object in objects) {
...
}
} catch (Exception e) {
// 例外処理
}
});
}
非同期処理は ContinueWith 内に lambda 式で記述します。 非同期エラーが発生している場合は Result を取得する際に例外がスローされますので、 try 節で適宜処理してください。
4.3. 同期呼び出し¶
同期呼び出しをする場合は、以下のような処理になります。
public void TestQuerySync()
{
NbObjectBucket bucket = NbObjectBucket.New("bucket1");
try {
var objects = bucket.QueryAsync(new NbQuery()).Result;
foreach (var object in objects) {
...
}
} catch (Exception e) {
// 例外処理
}
}
Task.Result を呼び出すことで、同期呼び出しとなります。 結果を取得するまで、処理はブロッキングされます。
非同期エラーが発生している場合は Result 取得時に例外がスローされますので、 try 節で適宜処理してください。
4.4. HTTPリクエストタイムアウト・キャンセル¶
4.4.1. HTTPリクエストタイムアウト時間の変更¶
デフォルトでは HTTP リクエストのタイムアウト時間は無限大となっています。
この値は NbService の HttpTimeout で変更することができます。 以下に例を示します。
NbService service = NbService.GetInstance();
// タイムアウトを2分に変更
service.HttpTimeout = TimeSpan.FromMinutes(2);
タイムアウトが発生すると、TaskCanceledException 例外が送出されます。
なお、一度でも HTTP リクエストを発行したあとでタイムアウト値を変更すると、 既存の HTTP(S) のコネクションは再利用されず、再接続となりますので注意してください。
4.4.2. HTTPリクエストキャンセル¶
NbService.CancelPendingRequest() を呼び出すことで、発行中の HTTP リクエストを すべてキャンセルすることができます。
リクエストをキャンセルすると、リクエスト元には TaskCanceledException 例外が送出されます。