【发布时间】: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);
}
我认为这没有意义,因为这实际上是一个没有出路的无限循环。我错过了什么吗?如果是这样,请对其工作原理进行一些解释。
编辑:我得到了示例的范围,该函数正在尝试处理项目,直到它用完。我还知道Task 与Task<void> 相同,即此函数不必返回任何内容。但是它有一个while(true) 的事实让我很困扰,因为这意味着这个函数永远运行。这是否意味着由调用函数来终止应用程序?这部分的细节我不太清楚。
【问题讨论】:
-
这是一个无限循环在示例的范围内是有意义的,因为它只是用来描述一个程序,该程序将在生成项目时继续运行并使用它们。就生产代码而言,可能做这样的无限循环并不实用。
-
好的,我想我得到了那个部分,但不能像他们展示的那样使用它,对吧?我会认为 while 必须在一些需要在循环内更新的布尔值上。
-
您完全可以按照显示的方式使用它。只要调用 ConsumerAsync() 的线程不等待返回,任务就会在单独的线程上运行,不会阻塞调用线程。
-
还是不清楚。在程序的上下文中,即使调用者不期望返回,ConsumerAsync 永远不会返回任何东西怎么办?在这种情况下,即使 m_data 为空并且没有任何东西可以“处理”,它仍然保留在(无限)循环中。如何终止这样的程序?
标签: c# asynchronous while-loop task-parallel-library