C# 関数の実行を許可する最大時間を設定する方法

メソッドに許可される最大時間を設定したい場合があります。 1 つの例は、コードが応答を停止する外部依存関係と通信している場合です。データベース接続、またはフリーズするハードウェアの一部.

これをさらに調べるシナリオを考えてみましょう。

実行時間の長いメソッドがあるとします。これは整数を返すのにランダムに 1 秒から 10 秒かかります。

private static int LongRunningMethod()
{
    var r = new Random();
 
    var randomNumber = r.Next(1, 10);
 
    var delayInMilliseconds = randomNumber * 1000;
 
    Task.Delay(delayInMilliseconds).Wait();
    
    return randomNumber;
}

ただし、最大 3 秒より長く待ちたくないとも言います。 3 秒待った後に TimeoutException をスローするにはどうすればよいですか?

Task.Run to the rescue

.NET では、タスクは実行したいものです。 Task の Run メソッドに関数を渡すことができます。このメソッドは、その関数を別のスレッドで非同期に実行し、Task オブジェクトを返します。

だから何? Task オブジェクトは Task.Run メソッドによってすぐに返されるため、Task の Wait メソッドを呼び出して、タスクが完了するまで 3 秒間待機することができます。正常に完了した場合、このメソッドは true を返します。完了していない場合は false を返します。したがって、出力をテストし、実行したい内容に応じて出力を返すことができます。

var task = Task.Run(() =>
{
    return LongRunningMethod();
});
 
bool isCompletedSuccessfully = task.Wait(TimeSpan.FromMilliseconds(3000));
 
if (isCompletedSuccessfully)
{
    return task.Result;
}
else
{
    throw new TimeoutException("The function has taken longer than the maximum time allowed.");
}

このパターンを使用すると、コードのパフォーマンスを向上させることができます。これにより、アプリケーションが何らかの理由でロックアップした場合に、ロックアップする最大時間を制御できることが保証されます。