在我的C#程序中,我有一个自动的函数调用序列。它们被顺序调用,每个所需的功能数据取决于前一个。所以每个功能都必须等待另一个功能完成。
我不知道怎么做,但是在下一个功能开始时,某些功能结果不可用。
我尝试使用线程来解决这个问题:
Task taskA = Task.Factory.StartNew(() => generateData());
taskA.Wait();
if(taskA.IsCompleted)
{
System.Windows.MessageBox.Show("Generation has been completed.");
Task taskB = Task.Factory.StartNew(() => Thread.SpinWait(100000));
taskB.Wait();
}
else
System.Windows.MessageBox.Show("Generation has NOT been completed.");
nextFunctionCall();
但不知何故,这并没有正常运作。
以下功能在某个时刻停止工作,处于无限循环中。
我只是通过使用简短的计时器来绕过这个线程:
generateData();
Thread.SpinWait(1000000000);
nextFunctionCall();
当然,这不是一个好的解决方案......
知道为什么线程不起作用?
我是否必须处理taskA?
由于
答案 0 :(得分:1)
顺序机制;管道;或者过滤器图可以使用.NET中的TPL DataFlow库来实现。
MSDN:
数据流组件构建在TPL的类型和调度基础结构之上,并与异步编程的C#,Visual Basic和F#语言集成集成。当您有多个必须以异步方式相互通信的操作或希望在数据可用时处理数据时,这些数据流组件非常有用。例如,考虑一个处理来自网络摄像头的图像数据的应用程序。通过使用数据流模型,应用程序可以在图像帧可用时处理它们。
DataFlow允许您将代码分解为专门用于特定操作的块。定义后,将块连接在一起。关于在块之间和何时传递消息的定义。
DataFlow使您可以完全控制每个块的并发级别以及块在给定时间可以操作的消息数。
在您的示例中,您可以定义一个名为generateDataBlock
的块,它被“连线”以将数据推送到processing
块。