2016-11-01 14 views
-2

このquestionは、タスクがタイムアウトで終了するのを非同期的に待つ方法について答えています。タスクを使用した条件付きステートメントのデバッグ

以下に示すように、現在の値が定義済みのしきい値よりも大きいかどうかをチェックする、同様の非同期メソッドを記述しました。以下に示すように、私は関数を呼び出しています同様のソリューションgivenに基づいて

public async Task<bool> FindThreshold(CancellationTokenSource cts) 
{    
    await Task.Run(()=> { 
     if (this.currentValue >= this.ThresholdValue) { 
      this.ThresholdFound = true; 
     } else { 
      this.ThresholdFound = false; 
     } 
    }); 
    if (ThresholdFound) 
     return true; 
    else 
     return false; 
} 

var found = await FindThresholdAsyncAsync(cts); 
if (await Task.WhenAny(task, Task.Delay(
    TimeSpan.FromMilliseconds(Convert.ToDouble(timeout)*1000), 
    cts.Token) == found) 
{ 
    await found; 
} 

エラーメッセージがオペレータ「==」はタイプ「タスク」のオペランドに適用することができないと言いますと 'ブール'。私はTask.Delayがタスクを返すことを理解していますが、hereというソリューションの場合にはなぜ機能しているのか理解できませんでした。明らかに、私は何かが欠けているので、どんな洞察力が本当に役立つでしょう。

答えて

1

FindThresholdの結果を待ってはいけません。 Task.WhenAnyはタスクのリストを取り、最初のタスクを終了します。タイムアウトしたかどうかを知るには、それをFindThresholdによって返されたタスクと比較する必要があります。 結果を取得できます。

var task = FindThreshold(cts); 
if (await Task.WhenAny(task, Task.Delay(
    TimeSpan.FromMilliseconds(Convert.ToDouble(timeout)*1000), 
    cts.Token)) == task) 
{ 
    var found = task.Result; // No need to await because we know the task is completed 
} 
else 
{ 
    // Timeout 
} 
+0

FindThresholdタスクの戻り値の型を持っているので、それはまだSystem.Threading.Task.Taskに「ブール」から変換することはできませんと言って「==」の用法で文句を言います。また、私はこのソリューション[リンク](http://stackoverflow.com/questions/23272911/is-it-possible-to-use-taskbool-in-if-conditions)に従って私はawaitキーワードを使用していたboolではなく、タスクを返すので、FindThresholdメソッドを待機します。 – kosol

+0

それはポイントです。 boolではなく、比較のためにTaskが必要なので、あなたは待っていません。チェックの後で、あなたはboolを得るために待つ(または '.Result'を呼び出します)。私の答えでコードを試してみてください。エラーはありません。 –

+0

@kosol実際にはかっこがありませんでした。一定。 –

関連する問題