【问题标题】:Infinite while loop in TAP exampleTAP 示例中的无限 while 循环
【发布时间】:2016-08-16 05:26:51
【问题描述】:

在研究 TAP(基于任务的异步模式)时,我在此 MSDN webpage 上找到了这个示例 sn-p。

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);
}

我认为这没有意义,因为这实际上是一个没有出路的无限循环。我错过了什么吗?如果是这样,请对其工作原理进行一些解释。

编辑:我得到了示例的范围,该函数正在尝试处理项目,直到它用完。我还知道TaskTask&lt;void&gt; 相同,即此函数不必返回任何内容。但是它有一个while(true) 的事实让我很困扰,因为这意味着这个函数永远运行。这是否意味着由调用函数来终止应用程序?这部分的细节我不太清楚。

【问题讨论】:

  • 这是一个无限循环在示例的范围内是有意义的,因为它只是用来描述一个程序,该程序将在生成项目时继续运行并使用它们。就生产代码而言,可能做这样的无限循环并不实用。
  • 好的,我想我得到了那个部分,但不能像他们展示的那样使用它,对吧?我会认为 while 必须在一些需要在循环内更新的布尔值上。
  • 您完全可以按照显示的方式使用它。只要调用 ConsumerAsync() 的线程不等待返回,任务就会在单独的线程上运行,不会阻塞调用线程。
  • 还是不清楚。在程序的上下文中,即使调用者不期望返回,ConsumerAsync 永远不会返回任何东西怎么办?在这种情况下,即使 m_data 为空并且没有任何东西可以“处理”,它仍然保留在(无限)循环中。如何终止这样的程序?

标签: c# asynchronous while-loop task-parallel-library


【解决方案1】:

如果您想通过 TAP 方式中断循环,您可以使用 CancellationTokenSource 并调用 Cancel 来中断循环。 您可以在您发布的原始 link 以及我在此处添加的 CancellationTokenSource 的 MSDN 页面上阅读更多相关信息。

【讨论】:

    猜你喜欢
    • 2014-03-29
    • 2012-12-24
    • 2015-06-25
    • 2013-02-22
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多