是否有线程的await语句?

Der*_*zer 5 c# multithreading async-await

嗨,我想知道是否有类似于await语句的内容,它与任务一起使用,我可以用c#中的线程实现?

我想做的是:

启动线程A,计算一些数据并将结果放在变量上x.在该变量x被转移到另一个线程B并且同时线程A再次开始计算一些数据之后,线程B开始另一个计算结果x.

更新:好的,似乎有一些混乱,所以我的描述会更准确:

我使用两个产生数据的传感器.的数据需要在将SensorA检索数据(这需要很长的时间)这样的方式进行检索和之后立即从SensorB数据必须在另一个线程被检索,同时将SensorA继续检索另一数据块.问题是我不能将两个传感器的数据排队在同一队列中,但我需要将两个传感器的数据存储在一个数据结构/对象中.

我的想法是这样的:

  1. 从线程A中的传感器A获取数据
  2. 将结果提供给线程B并重新启动线程A.
  3. 当线程A再次运行时,线程B从传感器B获取数据并计算来自传感器A和B的数据

您可以假设线程A总是需要比线程B更长的时间

Dam*_*ver 6

正如我在评论中所说.这看起来像经典的制作人/消费者,我们可以使用它,例如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就是您需要处理需要关闭此过程的任何代码.