Der*_*zer 5 c# multithreading async-await
嗨,我想知道是否有类似于await
语句的内容,它与任务一起使用,我可以用c#中的线程实现?
我想做的是:
启动线程A,计算一些数据并将结果放在变量上x
.在该变量x
被转移到另一个线程B并且同时线程A再次开始计算一些数据之后,线程B开始另一个计算结果x
.
更新:好的,似乎有一些混乱,所以我的描述会更准确:
我使用两个产生数据的传感器.的数据需要在将SensorA检索数据(这需要很长的时间)这样的方式进行检索和之后立即从SensorB数据必须在另一个线程被检索,同时将SensorA继续检索另一数据块.问题是我不能将两个传感器的数据排队在同一队列中,但我需要将两个传感器的数据存储在一个数据结构/对象中.
我的想法是这样的:
您可以假设线程A总是需要比线程B更长的时间
正如我在评论中所说.这看起来像经典的制作人/消费者,我们可以使用它,例如a BlockingCollection
.
这是对该页面中的示例的轻微修改:
BlockingCollection<Data> dataItems = new BlockingCollection<Data>(100);
// "Thread B"
Task.Run(() =>
{
while (!dataItems.IsCompleted)
{
Data dataA = null;
try
{
dataA = dataItems.Take();
}
catch (InvalidOperationException) { }
if (dataA != null)
{
var dataB = ReadSensorB();
Process(dataA,dataB);
}
}
Console.WriteLine("\r\nNo more items to take.");
});
// "Thread A"
Task.Run(() =>
{
while (moreItemsToAdd)
{
Data dataA = ReadSensorA();
dataItems.Add(dataA);
}
// Let consumer know we are done.
dataItems.CompleteAdding();
});
Run Code Online (Sandbox Code Playgroud)
然后moreItemsToAdd
就是您需要处理需要关闭此过程的任何代码.