在.Net中并行推送和推送数据

时间:2018-01-26 16:11:08

标签: c# database multithreading parallel-processing task-parallel-library

到目前为止,我只编写了单核心程序。现在我想提高我的性能,并试图找出如何拉动和推送数据并行化。但我甚至不知道我是否对MultiThreading有正确的想法。

实际上这是一个非常简单的案例。我从外部接口提取数据,重新编写它们以使它们按正确的顺序排列并将它们推入OpenGL管道中以便绘制它们。

我使用 WPF应用程序作为GUI并使用SharpGL(OpenGL包装)呈现我的数据。该程序在双核处理器上运行。

这是我的愿景草图。

enter image description here

所以我的想法是使用bufferArray。现在的线索:我如何从不同的thrads中读取同一个数组?

我被建议通知 OpenMP 。但事实证明,对于.Net和C#来说,这不是一个好主意。

你能推荐一些贴纸吗?也许解释如何在这种情况下使用任务并行库(TPL)。

1 个答案:

答案 0 :(得分:1)

对此的正确描述是生产者消费者模式。在.Net中,您可以使用TPL Dataflow

执行此操作

可以使用BlockingCollection构建另一个实现。基本版本:

BlockingCollection<int> bc = new BlockingCollection<int>();

async Task Main()
{
    // Fire up two readers
    Task.Run(() => ReadCollection1());
    Task.Run(() => ReadCollection2());

    // Add items to process.
    bc.Add(5);
    bc.Add(6);
    bc.Add(7);
    bc.Add(8);
    bc.Add(9);

    bc.CompleteAdding(); // Signal we are finished adding items (on close of application for example)
}

void ReadCollection1()
{
    foreach (var item in bc.GetConsumingEnumerable()) 
    {
        $"1 processed {item}".Dump();
    }
}


void ReadCollection2()
{
    foreach (var item in bc.GetConsumingEnumerable()) 
    {
        $"2 processed {item}".Dump();
    }
}