2016-08-15 8 views
-2

TAP(タスクベースの非同期パターン)の研究中に、このMSDN webpageのスニペットが見つかりました。TAPの無限ループ中の例

private static AsyncProducerConsumerCollection<int> m_data = …; 
… 
private static async Task ConsumerAsync() 
{ 
    while(true) 
    { 
     int nextItem = await m_data.Take(); 
     ProcessNextItem(nextItem); 
    } 
} 
… 
private static void Produce(int data) 
{ 
    m_data.Add(data); 
} 

これは実際には出口がない無限ループなので意味がないと思います。何か不足していますか?もしそうなら、それがどのように機能するかについていくつかの説明を理解してください。

EDIT:例の範囲を取得します。その関数は、実行されるまでアイテムを処理しようとしています。また、TaskTask<void>と同じです。つまり、この関数は何も返す必要はありません。しかし、それがwhile(true)を持っているという事実は、この機能が永遠に実行されることを意味するので、私は気になります。これは、アプリケーションを終了するための呼び出し関数までであることを意味しますか?この部分の詳細はあまり分かりません。

+1

無限ループであるということは、例の範囲では意味があります。なぜなら、アイテムが実行されたときにアイテムを実行して消費し続けるプログラムがあるからです。現時点では、生産コードに関しては、このような無限ループを行うのは実用的ではありません。 –

+0

OK、私はその部分を持っていると思っていますが、それは彼らがそれを示した方法で使用することはできませんよね?私はwhileループ内で更新する必要があるいくつかのブール値でなければならないと思っていただろう。 –

+1

絶対に使用することができます。 ConsumerAsync()を呼び出すスレッドがリターンを待っていない限り、タスクは別のスレッドで実行され、呼び出しスレッドをブロックしません。 –

答えて

1

ループをTAP方法で中断するには、CancellationTokenSourceを使用し、Cancelを呼び出してループを中断します。 あなたが投稿した元のlinkと、MSDNページのCancellationTokenSourceの両方で、その詳細を読むことができます。