3

ASP.Net WebAPIを使用して、次のような非同期アクションを持つコントローラーがあります。

[HttpPost]
public async Task<string> DoSomething(string foo)
{
  var result = await MyAsynchronousTask(foo);
  return result;
}

このコントローラーが行うことは重要ではありません。重要なのは、新しい.net 4.5 async/awaitサポートを使用して非同期タスクを待機していることです。

質問:指定した期間が経過するとタイムアウトするように指示するにはどうすればよいですか?必ずしもタスクをキャンセルしたくはありません。発信者が永遠にハングアップしないようにしたいだけです。(ただし、私はそれを両方の方法で見ることに興味があります。)

4

1 に答える 1

7

「C#プログラム」を選択してLINQPadでバージョンを作成しました。これは、2行の出力でコンパイルおよび実行され、タイムアウトと成功の両方のケースを示しています。

00:00:05のタイムアウトが期限切れになりました

fooの結果を正常に取得しました

スニペットは次のとおりです。

void Main()
{
    CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10)).Wait();
    CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0)).Wait();
}

public async Task CallGetStringWithTimeout(TimeSpan callTimeout, TimeSpan callAddedDelay)
{
    var myTask = GetStringAsync(callAddedDelay);
    await Task.WhenAny(Task.Delay(callTimeout), myTask);
    if (myTask.Status == TaskStatus.RanToCompletion)
    {
        Console.WriteLine ("Successfully got result of {0}", await myTask);
    }
    else
    {
        Console.WriteLine ("Timeout of {0} expired", callTimeout);
    }
}

public async Task<string> GetStringAsync(TimeSpan addedDelay)
{
    await Task.Delay(addedDelay);
    return "foo";
}

ただし、「通常の」方法は、CancellationTokenSourceを使用し、タイムアウトをctorparamとして指定することです。すでにCancellationTokenSourceがある場合は、その上でCancelAfterメソッドを呼び出すことができます。これにより、指定されたタイムアウトのキャンセルがスケジュールされます。

于 2012-08-21T01:05:06.180 に答える