Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用线程避免过早访问数据_C#_Multithreading_Task - Fatal编程技术网

C# 使用线程避免过早访问数据

C# 使用线程避免过早访问数据,c#,multithreading,task,C#,Multithreading,Task,在我的C#程序中,我有一个自动的函数调用序列。它们按顺序调用,每个函数所需的数据取决于前置函数。因此,每个函数都必须等待另一个函数完成 我不知道怎么做,但在下一个函数开始时,某些函数的结果不可用 我试图通过使用线程来解决此问题: Task taskA = Task.Factory.StartNew(() => generateData()); taskA.Wait(); if(taskA.IsCompleted) { System.Windows.MessageBox.Sho

在我的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();
但不知何故,这并不能正常工作

以下函数在某个点停止工作,并处于无休止的while循环中

我通过在短时间内使用以下命令绕过了此线程:

generateData();
Thread.SpinWait(1000000000);
nextFunctionCall();
当然,这不是一个好的解决方案

知道线程为什么不工作吗

我必须处理taskA吗


感谢

顺序机制;管道;或者,可以使用.NET中的TPL库实现过滤图

MSDN:

数据流组件构建在TPL的类型和调度基础设施上,并与C#、Visual Basic和F#语言支持集成,以实现异步编程。当您有多个必须彼此异步通信的操作时,或者当您希望在数据可用时处理数据时,这些数据流组件非常有用。例如,考虑从Web摄像机处理图像数据的应用程序。通过使用数据流模型,应用程序可以处理可用的图像帧

数据流允许您将代码分解为特定操作中专用的块。定义后,将块连接在一起。这取决于什么定义了要在块之间传递的消息以及何时传递

数据流使您能够完全控制每个块的并发级别以及块在给定时间可以操作的消息数


在您的示例中,您可以定义一个名为
generateDataBlock
的块,该块通过“连线”将数据推送到
处理
块。

如果您需要从其他函数的输出中输入函数输入,那么使用线程就没有任何意义。顺序处理是一种方法,您的“某些函数结果在下一个函数开始时不可用”问题来自其他地方。您确实应该按顺序执行此操作。在这里使用线程没有多大意义。而且,我不知道为什么它不起作用;)。但我非常确信,你会更容易坚持顺序方法;管道;或者可以使用.NET中的TPL库实现过滤图“我有一个问题。我将使用线程解决它。现在我有两个问题。”